web-dev-qa-db-ja.com

ObjectiveCでの比較-ARCでは「int」から「id」への暗黙的な変換は許可されていません

「faultyline」とマークされた行で「「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
8
Mads K

NSArrayには、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では、NSNumberを作成するためのよりコンパクトな構文が可能になりました。あなたはそれを次のように行うことができます:

NSNumber *someNumber = @(3);

そして、あなたのメソッドは次のように書き直すことができます:

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

オブジェクト(おそらくint)が期待される場所でNSNumberを使用しています。したがって、使用する前に変換してください。

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