2009-03-09 18 views
36

Necesito utilizar una matriz de booleanos en Object-C. Tengo que sobre todo configurado, pero el compilador lanza una advertencia en la siguiente declaración:Objetivo C Boolean Array

[updated_users replaceObjectAtIndex:index withObject:YES]; 

Esto es, estoy seguro, porque sí no es simplemente un objeto; es un primitivo Independientemente, tengo que hacer esto, y agradecería enormemente consejos sobre cómo lograrlo.

Gracias.

+3

Al preguntar por una advertencia por favor, puesto el aviso de que se trate :) –

Respuesta

69

Sí, eso es exactamente lo que es: los contenedores NS * solo pueden almacenar el objetivo-C objetos, no tipos primitivos.

Usted debe ser capaz de lograr lo que desea envolviéndolo en un NSNumber:

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

o utilizando @(YES) que envuelve un BOOL en un NSNumber

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

A continuación, puede extraer el boolValue:

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

11

Usted puede almacenar NSNumbers:

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

o utilizar un C-matriz, en función de sus necesidades:

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

Suponiendo que la matriz contiene objetos válidos (y no es un estilo de c array):

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

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

Tengo curiosidad por averiguar por qué las mellas respuesta tiene tanto más apoyo que éste , ya que esto parece más elegante. ¿Alguien puede explicar la diferencia? – Chris

8

Al igual que Georg dijo, use una C-array.

BOOL myArray[10]; 

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

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

Martijn, "miMatriz" es el nombre que utiliza, "matriz" en el ejemplo de Georg.

1

Si su colección es grande o si desea que sea más rápida que objc objects, intente con los tipos CFBitVector/CFMutableBitVector que se encuentran en CoreFoundation. Es uno de los tipos de colecciones de CF que no incluye y con contraparte NS, pero se puede incluir en una clase objc rápidamente, si se desea.

3

Desde XCode 4.4 puede usar literales Objective-C.

[updated_users replaceObjectAtIndex:index withObject:@YES];

Dónde @YES es equivalente a [NSNumber numberWithBool:YES]