2014-02-20 174 views
0

我刚开始学习Objective-C,我试图用一个随机数来获得该数字的键值。当密钥是一个随机数时,我如何从字典中获取密钥值?

显然(对于大多数人),由于NSNumber和NSUInteger具有不同的数据类型,因此无法编译。但是,这是我最好的拍摄,但编译器给了我以下错误:

Implicit conversion of a non-Objective-C pointer type 'NSUInteger *' (aka 'unsigned int *') to 'id' is disallowed with ARC

有没有人在那里,愿意引导我到这可能微不足道(对于大量的你)问题?

这是我的尝试:

NSDictionary *refDictionary = [[NSDictionary alloc] initWithObjectsAndKeys: 
            @"one", [NSNumber numberWithInteger:0], 
            @"two", [NSNumber numberWithInteger:1], 
            @"one", [NSNumber numberWithInteger:2], 
            @"two", [NSNumber numberWithInteger:3], 
            @"four",[NSNumber numberWithInteger:4], 
            @"six", [NSNumber numberWithInteger:5], nil]; 


     NSUInteger *dieIndex = arc4random_uniform(6); 

     NSString *imageName = [refDictionary objectForKey:dieIndex]; 
+1

的NSString * imageName = [refDictionary objectForKey:[NSNumber的numberWithInteger:dieIndex]; – Merlevede

+1

如果你的密钥是连续的数字,为什么不使用数组? – Sebastian

+0

我得到:不兼容的整数转换指针发送'NSUInteger *'(aka'unsigned int *')到'NSInteger'类型的参数(aka'int')@Merlevede –

回答

2

您可以使用:

[NSNumber的numberWithUnsignedInteger:dieIndex]

NSString *imageName = [refDictionary objectForKey: [NSNumber numberWithUnsignedInteger:dieIndex] ]; 
+0

谢谢。这解决了我的问题。 –

0

两个问题:

  1. 你没有#import <stdlib.h>,所以编译器不知道在哪里可以找到arc4random_uniform()函数 - 更糟糕的是,你的代码隐含着错误的签名。它返回u_int32_t,而不是NSUInteger*

  2. ,你应该使用相同的语法数字转换为NSNumber,你已经知道如何使用:

    int dieIndex = arc4random_uniform(6); 
    
    NSString *imageName = [refDictionary objectForKey:[NSNumber numberWithInteger:dieIndex]]; 
    

如果你想使你的代码更易读(和非移植到旧版iOS),您甚至可以使用新的风格的语法:

NSString *imageName = refDictionary[@(dieIndex)]; 
+0

你不会声明它:u_int32_t dieIndex = arc4random_uniform(6); – markhunte

+0

@markhunte你可以,但这些苹果typedefs是浪费时间恕我直言。 'int'对于0到5范围内的整数是一个完全合理的容器;让我们不要幻想。 – Quuxplusone

+0

不知道我会称它变得奇特。这只是一个你为什么不使用它的问题。在这种情况下,什么会被归类为int的不合理使用? – markhunte