在目标C中进行比较 - ARC不允许将'int'隐式转换为'id'

时间:2014-02-06 12:55:14

标签: ios iphone objective-c casting type-conversion

我收到错误“在”错误行“标记的行处”不允许将“int”隐式转换为“id”。我想它与我正在检查数组中的整数有关,它包含对象而不是整数。

#import "RandomGenerator.h"

@implementation RandomGenerator

NSMutableArray *drawnNumbers;

-(int) randomNumber:(int)upperNumber {
    return arc4random_uniform(upperNumber);
}

-(NSMutableArray*) lotteryNumbers :(int)withMaximumDrawnNumbers :(int)andHighestNumber {
    for (int i = 1; i <= withMaximumDrawnNumbers; i++)
    {
        int drawnNumber = [self randomNumber:andHighestNumber];
        if ([drawnNumbers containsObject:drawnNumber]) {  //faulty line
            //foo
        }
    }
    return drawnNumbers;
}

@end

2 个答案:

答案 0 :(得分:35)

NSArrays只能包含objective-c对象。所以实际上方法 containsObject:期望一个对象,而不是int或任何其他原始类型。

如果您想在NSArray中存储号码,您应该将它们打包到 NSNumber 对象中。

NSNumber *someNumber = [NSNumber numberWithInt:3];

在您的情况下,如果我们假设drawnNumbers已经是NSNumbers的数组,您应该将 randomNumber:生成更改为:

-(NSNumber*) randomNumber:(int)upperNumber {
    return [NSNumber numberWithInt:arc4random_uniform(upperNumber)];
}

然后在lotteryNumbers方法中提取它时,你应该:

NSNumber *drawnNumber = [self randomNumber:andHighestNumber];

另一个注意事项是针对lotteryNumbers定义的方法。你使用了一个非常奇怪的名字,我认为你误解了方法命名在objective-c中是如何工作的。你可能正在寻找更像的东西:

-(NSMutableArray*) lotteryNumbersWithMaximumDrawnNumbers:(int)maximumDrawnNumbers andHighestNumber:(int)highestNumber;

延迟编辑:

Objective-C现在允许使用更紧凑的语法来创建NSNumbers。你可以这样做:

NSNumber *someNumber = @(3);

您的方法可以改写为:

-(NSNumber*) randomNumber:(int)upperNumber {
    return @(arc4random_uniform(upperNumber));
}

答案 1 :(得分:6)

您正在使用int,其中需要一个对象(可能是NSNumber)。所以在使用前转换:

if ([drawnNumbers containsObject:@( drawnNumber )])