2009-03-09 8 views
36

Мне нужно использовать массив логических элементов в объективе-c. У меня это в основном создана, но компилятор бросает предупреждение в следующем заявлении:Objective C Boolean Array

[updated_users replaceObjectAtIndex:index withObject:YES]; 

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

Спасибо.

+3

Прося о предупреждении пожалуйста, напишите предупреждение в вопросе :) –

ответ

69

Да, это точно, что это такое: контейнеры 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];

11

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

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

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

BOOL array[100]; 
array[31] = YES; 
14

Если предположить, что массив содержит действительные объекты (а не с-стиль массив):

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

[updated_users replaceObjectAtIndex:index withObject:NSBool(YES)]; 
+2

Мне интересно узнать, почему Никс ответ получил так много больше поддержки, чем этот , поскольку это кажется более элегантным. Может ли кто-нибудь объяснить разницу? – Chris

8

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

BOOL myArray[10]; 

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

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

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

1

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

3

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

[updated_users replaceObjectAtIndex:index withObject:@YES];

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