2010-09-29 7 views
33

Ho un file plist che contiene una matrice di dizionari. Qui è uno di loro:Ripristino di una BOOL all'interno di un NSDictionary da un file plist

Fred dizionario
Nome Fred
isMale [casella è selezionata]

Così ora sto in fase di inizializzazione il mio oggetto persona con il dizionario che ho letto dal file plist:

-(id) initWithDictionary: (NSDictionary *) dictionary { 
    if (self = [super init]) 
    self.name = [dictionary valueForKey: @"Name"]; 
    self.isMale = ???? 
    } 

Come terminare il codice sopra in modo che self.isMale sia impostato su SÌ se la casella è selezionata nel file plist e NO se non lo è. Preferibilmente, impostare anche NO se non c'è alcun tasto isMale nel dizionario.

risposta

81

valori BOOL solitamente memorizzati in contenitori obj-c avvolti nell'oggetto NSNumber. Se è così nel tuo caso quindi è possibile recuperare il valore booleano utilizzando:

self.isMale = [[dictionary objectForKey:@"isMale"] boolValue]; 
+0

Fantastico! Grazie uomo. –

6

Vladimir ha ragione, sto solo andando a carillon e dire che è bene verificare che esistano questi valori dal plist pure e, se non lo si imposta di solito su un valore predefinito.

Qualcosa di simile:

id isMale = [dictionary valueForKey:@"isMale"]; 
self.isMale = isMale ? [isMale boolValue] : NO; 

che controlla per vedere se il valore per la chiave "isMale" esiste nel dizionario. Se lo fa, ottiene il valore boolValue. In caso contrario, imposta self.isMale sul valore predefinito di NO.

+3

Questo è necessario solo se si desidera che la persona sia di tipo maschile di default (predefinito su 'SÌ'). È possibile inviare il messaggio a 'nil' (il valore di ritorno di' - [NSDictionary objectForKey:] 'e' - [NSDictionary valueForKey:] 'quando la chiave non è presente nel dizionario) senza prima verificare se si sta bene con un valore predefinito di "NO". http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocObjectsClasses.html%23//apple_ref/doc/uid/TP30001163-CH11-SW7 –

+0

Ah sì, hai ragione . Sono rimasto intrappolato nel tentativo di fornire una risposta generale per valori diversi da BOOL (come una NSString) e fornire un modo generale per fornire valori predefiniti. – djdrzzy

+0

Sarò un cretino e dirò che Apple non è garantito per mantenere NO definito a (BOOL) 0 per sempre, nel qual caso il valore predefinito potrebbe non essere sempre NO. : P Se mai l'avessero cambiato, sarebbe stato piuttosto stupido e poco pratico. – djdrzzy