比较目标C – ARC不允许将’int’隐式转换为’id’

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

#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 

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

如果要在NSArray中存储数字,则应将它们打包到NSNumber对象中。

 NSNumber *someNumber = [NSNumber numberWithInt:3]; 

在你的情况下,如果我们假设drawnNumbers已经是一个NSNumbers数组,你应该将randomNumber: generation更改为:

 -(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)); } 

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

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