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

Mad*_*s K 8 iphone casting objective-c type-conversion ios

我在标记为"有缺陷的行"的行上收到错误"将'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
Run Code Online (Sandbox Code Playgroud)

man*_*sta 35

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

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

NSNumber *someNumber = [NSNumber numberWithInt:3];
Run Code Online (Sandbox Code Playgroud)

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

-(NSNumber*) randomNumber:(int)upperNumber {
    return [NSNumber numberWithInt:arc4random_uniform(upperNumber)];
}
Run Code Online (Sandbox Code Playgroud)

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

NSNumber *drawnNumber = [self randomNumber:andHighestNumber];
Run Code Online (Sandbox Code Playgroud)

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

-(NSMutableArray*) lotteryNumbersWithMaximumDrawnNumbers:(int)maximumDrawnNumbers andHighestNumber:(int)highestNumber;
Run Code Online (Sandbox Code Playgroud)

晚编辑:

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

NSNumber *someNumber = @(3);
Run Code Online (Sandbox Code Playgroud)

您的方法可以重写为:

-(NSNumber*) randomNumber:(int)upperNumber {
    return @(arc4random_uniform(upperNumber));
}
Run Code Online (Sandbox Code Playgroud)

  • 谢谢!并且方法命名很好,有点不对劲! (2认同)

Wai*_*ain 6

您正在使用某个int对象(可能NSNumber是预期的).所以在使用前转换:

if ([drawnNumbers containsObject:@( drawnNumber )])
Run Code Online (Sandbox Code Playgroud)