Объективный C Булевский массив
Мне нужно использовать массив булевых в objective-c. У меня это в основном настроено, но компилятор выдает предупреждение в следующем выражении:
[updated_users replaceObjectAtIndex:index withObject:YES];
Это, я уверен, потому что ДА просто не объект; это примитив. Независимо от того, мне нужно сделать это, и будет очень благодарен за советы о том, как это сделать.
Спасибо.
Ответы
Ответ 1
Да, именно это: контейнеры NS * могут хранить только объекты objective-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];
Ответ 2
Предполагая, что ваш массив содержит допустимые объекты (и не является массивом c-style):
#define kNSTrue ((id) kCFBooleanTrue)
#define kNSFalse ((id) kCFBooleanFalse)
#define NSBool(x) ((x) ? kNSTrue : kNSFalse)
[updated_users replaceObjectAtIndex:index withObject:NSBool(YES)];
Ответ 3
Вы можете либо сохранить NSNumbers
:
[updated_users replaceObjectAtIndex:index
withObject:[NSNumber numberWithBool:YES]];
или используйте C-массив, в зависимости от ваших потребностей:
BOOL array[100];
array[31] = YES;
Ответ 4
Как сказал Георг, используйте C-массив.
BOOL myArray[10];
for (int i = 0; i < 10; i++){
myArray[i] = NO;
}
if (myArray[2]){
//do things;
}
Martijn, "myArray" - это имя, которое вы используете, "массив" в примере georg.
Ответ 5
Из XCode 4.4 вы можете использовать литералы Objective-C.
[updated_users replaceObjectAtIndex:index withObject:@YES];
Где @YES
эквивалентно [NSNumber numberWithBool:YES]
Ответ 6
Если ваша коллекция большая или вы хотите, чтобы она была быстрее объектов objc, попробуйте типы CFBitVector
/CFMutableBitVector
, найденные в CoreFoundation. Это один из типов CF-Collections, который не поставляется с NS-копией NS, но при желании его можно быстро обернуть в класс objc.