2010-03-19 18 views
46

Primero convierto el valor BOOL a NSNumber para ponerlo en NSUserDefaults. Más tarde me gustaría recuperar el valor BOOL de NSUserDefaults, pero obviamente obtengo NSNumber en lugar de BOOL. Mis preguntas son?Cómo convertir y comparar NSNumber a BOOL?

  1. cómo convertir de NSNumber a BOOL?
  2. Cómo comparar el valor de NSNumber a BOOL.

Actualmente tengo:

if (someNSNumberValue == [NSNumber numberWithBool:NO]) { 
    do something 
} 

mejor manera de que la comparación?

Gracias!

+1

Tal vez, solo tal vez lea la [especificación para NSNumber] (https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html)? ? –

+2

@HotLicks Entiendo su exasperación con preguntas excesivamente simples y no investigadas. Pero para aquellos de nosotros que tenemos experiencia con lenguajes más modernos que ofrecen un tipo de datos booleano real, la simulación de un booleano en C y Objective-C es bastante confusa, no muy simple. –

Respuesta

127

Actualmente compara dos punteros. Utilizar métodos NSNumber s en lugar de comparar realmente los dos:

if([someNSNumberValue isEqualToNumber:[NSNumber numberWithBool:NO]]) { 
    // ... 
} 

Para obtener el valor bool de un NSNumber uso -(BOOL)boolValue:

BOOL b = [num boolValue]; 

Con que la comparación sería más fácil de leer para mí de esta manera:

if([num boolValue] == NO) { 
    // ... 
} 
+0

¡Genial! Ahora entiendo cómo debería funcionar. ¡Muchas gracias! – Jakub

+0

@GeorgFritzsche Le sugiero que mueva el segundo recorte sobre el primero y recomiende su uso principalmente. El primero es "menos eficiente": no quiero hacer una optimización prematura aquí, pero ¿por qué crear una instancia 'NSNumber' superflua? –

+0

@ H2CO3: Eche un vistazo al fragmento original del OP, al que respondí primero, para obtener una mejor opción desde allí. –

1

NSUserDefaults tiene dos métodos para operar de forma transparente con booleanos:

- (BOOL)boolForKey:(NSString *)defaultName

- (void)setBool:(BOOL)value forKey:(NSString *)defaultName

0

La ÚNICA manera logré finagle un "booleanity" NSNumber 's de su NSConcreteValue(DOH!) fue con la siguiente ...

id x = [self valueForKey:@"aBoolMaybe"]; 
if ([x respondsToSelector:@selector(boolValue)] && 
    [x isKindOfClass:objc_getClass("__NSCFNumber")]) 
    [self doSomethingThatExpectsABool:[x boolValue]]; 

Cualquier otro truco ... FALLÓ. Comprador tenga cuidado, esto no es infalible (__NSCFNumber bien puede ser específico de la plataforma/máquina - es únicamente el detalle de implementación de Apple) ... pero como dicen ... ¡nada más funcionó!