Objective C Boolean Array - PullRequest
       24

Objective C Boolean Array

38 голосов
/ 10 марта 2009

Мне нужно использовать массив логических значений в target-c. У меня это в основном настроено, но компилятор выдает предупреждение при следующем утверждении:

[updated_users replaceObjectAtIndex:index withObject:YES];

Это, я уверен, потому что ДА просто не объект; это примитив В любом случае, мне нужно это сделать, и я был бы очень признателен за советы, как этого добиться.

Спасибо.

Ответы [ 6 ]

71 голосов
/ 10 марта 2009

Да, это именно то, что и есть: контейнеры NS * могут хранить только объекты класса C, а не примитивные типы.

Вы должны быть в состоянии выполнить то, что вы хотите, свернув его в NSNumber:

[updated_users replaceObjectAtIndex:index withObject:[NSNumber numberWithBool:YES]]

или с помощью @(YES), который включает BOOL в NSNumber

[updated_users replaceObjectAtIndex:index withObject:@(YES)]]

Затем вы можете извлечь значение boolValue:

BOOL mine = [[updated_users objectAtIndex:index] boolValue];

14 голосов
/ 10 марта 2009

Предполагая, что ваш массив содержит допустимые объекты (и не является массивом в стиле c):

#define kNSTrue         ((id) kCFBooleanTrue)
#define kNSFalse        ((id) kCFBooleanFalse)
#define NSBool(x)       ((x) ? kNSTrue : kNSFalse)

[updated_users replaceObjectAtIndex:index withObject:NSBool(YES)];
11 голосов
/ 10 марта 2009

Вы можете хранить либо NSNumbers:

[updated_users replaceObjectAtIndex:index
                         withObject:[NSNumber numberWithBool:YES]];

или используйте массив C, в зависимости от ваших потребностей:

BOOL array[100];
array[31] = YES;
8 голосов
/ 08 декабря 2010

Как сказал Георг, используйте массив C.

BOOL myArray[10];

for (int i = 0; i < 10; i++){
  myArray[i] = NO;
}

if (myArray[2]){
   //do things;
}

Мартейн, «myArray» - это имя, которое вы используете, «массив» в примере georg.

4 голосов
/ 24 апреля 2013

В XCode 4.4 вы можете использовать литералы Objective-C.

[updated_users replaceObjectAtIndex:index withObject:@YES];

Где @YES эквивалентно [NSNumber numberWithBool:YES]

1 голос
/ 04 апреля 2012

Если ваша коллекция большая или вы хотите, чтобы она была быстрее объектов objc, попробуйте типы CFBitVector / CFMutableBitVector, найденные в CoreFoundation. Это один из типов коллекций CF, который не поставляется с NS-аналогом, но при желании его можно быстро обернуть в класс objc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...