2013-08-24 1 views
3

Здравствуйте, я работаю над проектом, и я пытаюсь добавить NSUInteger в NSMutableArray. Я новичок в Objective-C и C в целом. При запуске приложения NSLog отображает нуль.Добавить NSUInteger в NSMutableArray

Буду признателен за любую помощь, которую может предоставить любой.

Вот мой код

-(NSMutableArray *)flipCardAtIndex:(NSUInteger)index 
{ 
    Card *card = [self cardAtIndex:index]; 
    [self.flipCardIndexes addObject:index]; 

    if(!card.isUnplayable) 
    { 
     if(!card.isFaceUp) 
     { 
      for(Card *otherCard in self.cards) 
      { 
       if(otherCard.isFaceUp && !otherCard.isUnplayable) 
       { 
        int matchScore = [card match:@[otherCard]]; 
        if(matchScore) 
        { 
         otherCard.unplayable = YES; 
         card.unplayable = YES; 
         self.score += matchScore * MATCH_BONUS; 
        } 
        else 
        { 
         otherCard.faceUp = NO; 
         self.score -=MISMATCH_PENALTY; 
        } 
        break; 
       } 
      } 
      self.score -=FLIP_COST; 
     } 
     card.faceUp = !card.isFaceUp; 
    } 
    NSLog(@"%@",self.flipCardIndexes[self.flipCardIndexes.count-1]); 
    return self.flipCardIndexes; 
} 
+0

NSUInteger является «скаляр», а не «объект». Вы можете добавлять «объекты» в NSArray. Однако вы можете добавить NSNumber в NSArray, а NSNumber - это общий класс «обертка» для числовых типов. См. Спецификацию для NSNumber. –

ответ

10

NSArray (наряду с его подкласса NSMutableArray) поддерживает только объекты, вы не можете добавлять собственные значения к нему.

Заканчивать подпись -addObject:

- (void)addObject:(id)anObject 

Как вы можете видеть, что ожидает id в качестве аргумента, что примерно означает любой объект.

Таким образом, вы должны обернуть целое число в NSNumber например, следующим образом

[self.flipCardIndexes addObject:@(index)]; 

где @(index) является syntactic sugar для [NSNumber numberWithInt:index].

Тогда для того, чтобы превратить его обратно в NSUInteger при извлечении его из массива, вы должны «разворачивать» это следующим образом

NSUInteger index = [self.flipCardIndexes[0] integerValue]; // 0 as example 
+0

Учитывая опыт пользователя, это может помочь также объяснить, как вернуть NSUInteger из массива. – rmaddy

+0

@rmaddy, вы правы, добавили. спасибо –

2

Вы можете только добавлять объекты в NSMutableArrays. AddObject принимает объекты типа id, что означает, что он примет объект.

NSIntegers и NSUIntegers, однако, не являются объектами. Они просто определены как переменные стиля С.

#if __LP64__ || NS_BUILD_32_LIKE_64 
    typedef long NSInteger; 
    typedef unsigned long NSUInteger; 
#else 
    typedef int NSInteger; 
    typedef unsigned int NSUInteger; 
#endif 

Как вы можете видеть, они просто определены как ints и longs на основе макроса typedef.

Чтобы добавить это в свой массив, вам необходимо сначала преобразовать его в объект. NSNumber - это класс Objective C, который позволяет хранить несколько типов. Чтобы создать NSNumber, вам понадобится метод numberWithInt, передав переменную в качестве параметра.

NSNumber *number = [NSNumber numberWithInt:card]; 

Теперь, когда ваша переменная обернута в объект, вы можете добавить его в массив.

[self.flipCardIndexes addObject:number]; 

Наконец, если вы хотите, чтобы получить элемент в будущем, вы должны удалить объект, а затем преобразовать его обратно в целочисленное значение, вы можете использовать. Звонок

NSNumber *number = [self.flipCardIndexes objectAtIndex:index]; 

Где индекс - это индекс карты, которую вы пытаетесь получить. Затем вам нужно преобразовать это значение в целое число, вызвав integerValue.

NSUInteger *value = [number integerValue];