2009-05-24 22 views

Respuesta

149

Utiliza NSNumber.

Tiene init ... y number ... métodos que toman booleanos, como lo hace enteros, etc.

Desde el NSNumber class reference:

// Creates and returns an NSNumber object containing a 
// given value, treating it as a BOOL. 
+ (NSNumber *)numberWithBool:(BOOL)value 

y:

// Returns an NSNumber object initialized to contain a 
// given value, treated as a BOOL. 
- (id)initWithBool:(BOOL)value 

y:

// Returns the receiver’s value as a BOOL. 
- (BOOL)boolValue 
+0

Great! Supongo que internamente almacena el bool como 0/1? – Thanks

+5

@harms es correcto. Como ejemplo: 'NSDictionary * dictionary = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool: YES], @" someKey ", nil];' –

+24

Vale la pena señalar que ahora existe una sintaxis literal para NSNumbers. '@ YES' es lo mismo que' [NSNumber numberWithBool: YES] ' – jcampbell1

16

Si declara como un literal y está utilizando la versión 3.1 o sonido metálico arriba, debe usar @NO/@YES si lo declara literal. P.ej.

NSMutableDictionary* foo = [@{ @"key": @NO } mutableCopy]; 
foo[@"bar"] = @YES; 

Para más información sobre que:

http://clang.llvm.org/docs/ObjectiveCLiterals.html

+1

Obtiene un error del compilador: tipos de punteros incompatibles que inicializan NSMutableDictionary * con una expresión de tipo NSDictionary.Si cambia la declaración a NSDictionary en cambio, obtenga el error del compilador: Método esperado para escribir el elemento del diccionario no encontrado en el objeto de tipo NSDictionary * – Tony

+1

El literal solo creará un 'NSDictionary', no un' NSMutableDictionary'. Por lo tanto, asignar '@ YES' a' foo [@ "bar"] 'no es posible, ya que' @ {@ "clave": @NO} 'no es mutable. – redhotvengeance

+0

Sí, lo siento por ese error tipográfico, lo he actualizado. – sabalaba

39

La nueva sintaxis desde Apple LLVM Compiler 4.0

dictionary[@"key1"] = @(boolValue); 
dictionary[@"key2"] = @YES; 

La sintaxis convierte BOOL-NSNumber, que es aceptable para NSDictionary.

+1

Esta debería ser la respuesta aceptada. –

+0

Todavía funciona, realmente gracias hombre! –

2

Como jcampbell1 señaló, ahora se puede utilizar la sintaxis literal para NSNumbers:

NSDictionary *data = @{ 
         // when you always pass same value 
         @"someKey" : @YES 
         // if you want to pass some boolean variable 
         @"anotherKey" : @(someVariable) 
         }; 
-2

Prueba esto:

NSMutableDictionary *dic = [[NSMutableDictionary alloc] init]; 
[dic setObject:[NSNumber numberWithBool:TRUE] forKey:@"Pratik"]; 
[dic setObject:[NSNumber numberWithBool:FALSE] forKey:@"Sachin"]; 

if ([dic[@"Pratik"] boolValue]) 
{ 
    NSLog(@"Boolean is TRUE for 'Pratik'"); 
} 
else 
{ 
    NSLog(@"Boolean is FALSE for 'Pratik'"); 
} 

if ([dic[@"Sachin"] boolValue]) 
{ 
    NSLog(@"Boolean is TRUE for 'Sachin'"); 
} 
else 
{ 
    NSLog(@"Boolean is FALSE for 'Sachin'"); 
} 

La salida será de la siguiente manera:

de Boole es TRUE para 'Pratik '

booleana es FALSO para' Sachin '

+1

También puede hacer '[NSNumber numberWithBool: NO]' y '[NSNumber numberWithBool: YES]'. –

Cuestiones relacionadas