2010-03-19 15 views
46

Prima di convertire il valore BOOL in NSNumber per inserirlo in NSUserDefaults. Più tardi mi piacerebbe recuperare il valore BOOL da NSUserDefaults, ma ovviamente ottengo NSNumber invece di BOOL. Le mie domande sono?Come convertire e confrontare NSNumber in BOOL?

  1. come riconvertire da NSNumber a BOOL?
  2. Come confrontare il valore NSNumber con BOOL.

Attualmente ho:

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

un modo migliore per il confronto?

Grazie!

+1

Forse, solo forse leggi la [specifica per NSNumber] (https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/Foundation/Classes/NSNumber_Class/Reference/Reference.html)? ? –

+2

@HotLicks Capisco la tua esasperazione con domande eccessivamente semplici e senza risposta. Ma per quelli di noi esperti di linguaggi più moderni che offrono un vero tipo di dati booleani, la simulazione di un booleano in C e Objective-C è piuttosto confusa, tutt'altro che semplice. –

risposta

127

Attualmente si confrontano due puntatori. Utilizzare NSNumber s metodi, invece di confrontare in realtà i due:

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

Per ottenere il valore booleano da una NSNumber uso -(BOOL)boolValue:

BOOL b = [num boolValue]; 

Con che il confronto sarebbe più facile da leggere per me in questo modo:

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

Ottimo! Ora capisco come dovrebbe funzionare. Grazie molto! – Jakub

+0

@GeorgFritzsche Suggerisco di spostare il secondo snippato sopra il primo e raccomandarne l'uso principalmente. Il primo è "meno efficiente" - non voglio fare un'ottimizzazione prematura qui, ma perché creare un'istanza 'NSNumber' superfluo? –

+0

@ H2CO3: dai un'occhiata allo snippet originale dell'OP, a cui ho risposto per primo, per ottenere un'opzione migliore da lì. –

1

NSUserDefaults ha due metodi per operare in modo trasparente con booleane:

- (BOOL)boolForKey:(NSString *)defaultName

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

0

L'unico modo sono riuscito a finagle un "booleanity" NSNumber s' dalla sua NSConcreteValue(doh!) era con il seguente ...

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

Ogni altro trucco ... FAILED. Attenzione all'acquirente, questo non è infallibile (__NSCFNumber potrebbe essere specifico per piattaforma/macchina - è solo per l'implementazione di Apple) ... ma come si dice ... nient'altro ha funzionato!

Problemi correlati