2010-09-29 12 views
33

Tengo un archivo plist que contiene una matriz de diccionarios. He aquí uno de ellos:Restauración de un BOOL dentro de un NSDictionary desde un archivo plist

Fred Diccionario
Nombre Fred
isMale [casilla está marcada]

Así que ahora estoy inicializando mi persona objeto con el diccionario leí desde el archivo plist:

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

Cómo termino el código anterior para que self.isMale se establezca en SÍ si la casilla está marcada en el archivo plist, y NO si no lo está. Preferiblemente, también se establece en NO si no hay ninguna clave. Masculina en el diccionario.

Respuesta

81

BOOL valores generalmente almacenados en contenedores obj-c envueltos en el objeto NSNumber. Si esto es así en su caso, entonces se puede recuperar el valor bool usando:

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

¡Impresionante! Gracias hombre. –

6

Vladimir es correcto, yo sólo voy a meter su cuchara y decir que es bueno para comprobar la existencia de los valores de la plist, así , y si no lo establece en un valor predeterminado por lo general.

Algo así como:

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

que comprueba si existe el valor de la clave "isMale" en el diccionario. Si lo hace, obtiene el boolValue de él. Si no lo hace, establece self.isMale con el valor predeterminado de NO.

+3

Eso solo es necesario si desea que la persona sea hombre por defecto (valor predeterminado a 'SÍ'). Puede enviar el mensaje a 'nil' (el valor de retorno de' - [NSDictionary objectForKey:] 'y' - [NSDictionary valueForKey:] 'cuando la clave no está presente en el diccionario) sin verificar primero si está de acuerdo con un valor predeterminado de '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í, tienes razón . Me quedé atrapado tratando de proporcionar una respuesta general para valores distintos de BOOL (como un NSString) y proporcionando una forma general de proporcionar valores predeterminados. – djdrzzy

+0

Voy a ser un imbécil y decir que Apple no garantiza que NO se mantenga definido como (BOOL) 0 para siempre, en cuyo caso el valor predeterminado podría no ser siempre NO. : P Si alguna vez lo han cambiado, sería bastante estúpido y poco práctico. – djdrzzy

Cuestiones relacionadas