¿Cómo puedo agregar un valor booleano a un NSDictionary?


112

Bueno, para enteros usaría NSNumber. Pero SÍ y NO no son objetos, supongo. Afaik solo puedo agregar objetos a una NSDictionary, ¿verdad?

No pude encontrar ninguna clase contenedora para booleanos. ¿Hay alguna?

Respuestas:


156

Utiliza NSNumber.

Tiene métodos init ... y number ... que toman valores booleanos, al igual que los números enteros, etc.

De la referencia de clase NSNumber :

// 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

¡Excelente! Supongo que internamente almacena el bool como 0/1.
Gracias

5
@harms es correcto. Por ejemplo: NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], @"someKey", nil];
So Over It

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

51

La nueva sintaxis desde Apple LLVM Compiler 4.0

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

La sintaxis se convierte BOOLen NSNumber, que es aceptable para NSDictionary.


16

Si lo declara como literal y usa clang v3.1 o superior, debe usar @NO / @YES si lo declara como literal. P.ej

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

Para obtener más información al respecto:

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


1
Obtiene un error del compilador: tipos de puntero incompatibles que inicializan NSMutableDictionary * con una expresión de tipo NSDictionary. Si cambia la declaración a NSDictionary en su lugar, obtendrá 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, no es posible asignar @YESa, foo[@"bar"]ya @{ @"key": @NO }que no es mutable.
redhotvengeance

3

Como señaló jcampbell1 , ahora puede usar 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á la siguiente:

Booleano es VERDADERO para ' Pratik '

Booleano es FALSO para ' Sachin '


1
También puede hacer [NSNumber numberWithBool:NO]y [NSNumber numberWithBool:YES].
Alex Zavatone
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.