2014-02-06 4 views
5

과 함께 'int'의 암시 적 변환이 허용되지 않습니다. "로 표시된 줄에서" 'int'가 'ID'로 '암시 적으로 변환되지 않습니다.'라는 오류가 발생합니다. "잘못된 선". 나는 그것이 정수 대신 객체를 포함하고있는 배열의 정수를 검사하고 있다고 생각한다.객관적인 C에서 비교 - 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 

답변

31

NSArrays는 objective-c 개체 만 포함 할 수 있습니다. 따라서 실제적으로 메소드 containsObject :은 int 또는 다른 기본 유형이 아닌 객체를 필요로합니다.

NSArray에 번호를 저장하려면 NSNumber 개체에 포장해야합니다. lotteryNumbers에 그것을 따기 때 다음

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

그리고 : 세대 : 우리가 drawnNumbers 이미 NSNumbers의 배열이라고 가정하면 귀하의 경우에는

NSNumber *someNumber = [NSNumber numberWithInt:3]; 

, 당신은 난수를 변경해야 방법을 사용하려면 다음을 수행해야합니다.

NSNumber *drawnNumber = [self randomNumber:andHighestNumber]; 

lotteryNumbers에 대해 정의한 방법에 대한 또 다른 메모가 있습니다. 당신은 그것을 위해 정말로 이상한 이름을 사용했습니다, 나는 당신이 objective-c에서 메서드 네이팅이 어떻게 작동하는지 오해했다고 생각합니다. 당신은 아마 같은 뭔가를 찾고 있었다 :

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

늦은 편집 :

은 오브젝티브 C는 이제 방법을 NSNumbers를 만들기위한 컴팩트 구문을 할 수 있습니다.

NSNumber *someNumber = @(3); 

을 그리고 당신의 방법으로 다시 작성할 수 있습니다 : 당신은 그것을 좋아 할 수

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

감사합니다! 그리고 메소드 네이밍에 좋았습니다. –

5

당신은 객체 (아마도 NSNumber)이 예상되는 int을 사용하고 있습니다. 그래서 사용하기 전에 변환 :

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