2010-01-21 9 views
57

OK, estoy un poco confundido. Probablemente sea solo una trivialidad.Diccionario de Objective C insertando un BOOL

Tengo una función que se ve algo como esto:

- (void)getNumbersForNews:(BOOL)news andMails:(BOOL)mails { 
NSMutableDictionary *parameters = [[NSMutableDictionary alloc] init]; 
[parameters setValue:news forKey:@"getNews"]; 
[parameters setValue:mails forKey:@"getMails"];...} 

No importa si utilizo setValue:forKey: o setObject:ForKey:, siempre estoy recibiendo una advertencia:

" Pasando el argumento 1 del conjunto ... hace el puntero del número entero sin un molde "...

¿Cómo puedo insertar un bool en una dicción? ry?

Respuesta

116

Los valores en un NSDictionary deben ser objetos. Para resolver este problema, ajuste los valores booleanos en NSNumber objetos:

[parameters setValue:[NSNumber numberWithBool:news] forKey:@"news"]; 
[parameters setValue:[NSNumber numberWithBool:mails] forKey:@"mails"]; 
+10

Y no hay que olvidar que tarting con Clang v3.1, podemos utilizar literales: 'NSNumber * yesNumber = @ YES'; equivalente a '[NSNumber numberWithBool: SÍ]' – coco

+9

Así que, como dice @coco, se puede usar '' @ @ YES'and NO' como sustitutos de '[NSNumber numberWithBool: SÍ] y' '[NSNumber numberWithBool: NO]' respectivamente. Y como señala @AlBlue a continuación, la forma de recuperar el valor del diccionario más tarde sería usar '[[myDictionary objectForKey: theKey] boolValue]'. – RoberRM

+0

No No No. Está utilizando setValue, que no es un método NSMutableDictionary, sino un método KVO. Use setObject en su lugar. –

14

Los contenedores Objective-C solo pueden almacenar objetos Objective-C, por lo que debe envolver BOOL en algún objeto. Puede crear un objeto NSNumber con [NSNumber numberWithBool] y almacenar el resultado.
Más tarde puede recuperar su valor booleano usando NSNumber's -boolValue.

6

Puede insertar @"YES" o @"NO" objetos de cuerda y Cocoa lo lanzará a bool una vez que los vuelva a leer.

De lo contrario, sugeriría crear un diccionario utilizando el método de fábrica como dictionaryWithObjectsAndKeys:.

+0

Eso suena peligroso - lo que si quería la cadena? – quantumpotato

+0

Podría estar equivocado, pero usar boolValue y stringValue arrojaría los resultados necesarios. ¿Necesitas un booleano? Use boolValue. Necesita una cuerda? Ir con stringValue. – Eimantas

+0

@Eimantas Definitivamente prefiero tu camino ...;-) –

8

A BOOL no es un objeto; es un sinónimo de int y tiene 0 o 1 como sus valores. Como resultado, no se colocará en una estructura que contenga objetos.

Puede usar NSNumber para crear un contenedor de objetos para cualquiera de los tipos de enteros; hay un constructor [NSNumber numberWithBool:] que puede invocar para obtener un objeto y luego usarlo. Del mismo modo, puede usar eso para recuperar el objeto nuevamente: [obj boolValue].

2

Al ver la respuesta de @Steve Harrison tengo una comentario. Por alguna razón, esto no funciona con la aprobación de propiedades de objetos como, por ejemplo,

[parameters setValue:[NSNumber numberWithBool:myObject.hasNews] forKey:@"news"]; 

Esto establece la clave news a nulo en el parámetro NSDictionary (por alguna razón realmente no puede entender por qué)

Mi única solución era utilizar @ manera de Eimantas de la siguiente manera:

[parameters setValue:[NSNumber numberWithBool:myObject.hasNews ? @"YES" : @"NO"] forKey:@"news"]; 

Esto funcionó perfectamente. No me preguntes por qué pasar el BOOL directamente no funciona, pero al menos encontré una solución. ¿Algunas ideas?

7

código moderna para referencia:

parameters[@"getNews"] = @(news); 
Cuestiones relacionadas