2009-07-10 13 views
29

En el siguiente código, la primera declaración de registro muestra un decimal como se esperaba, pero el segundo NULL registros. ¿Qué estoy haciendo mal?Creación de un NSDictionary

NSDictionary *entry = [[NSDictionary alloc] initWithObjectsAndKeys: 
    @"x", [NSNumber numberWithDouble:acceleration.x], 
    @"y", [NSNumber numberWithDouble:acceleration.y], 
    @"z", [NSNumber numberWithDouble:acceleration.z], 
    @"date", [NSDate date], 
    nil]; 
NSLog([NSString stringWithFormat:@"%@", [NSNumber numberWithDouble:acceleration.x]]); 
NSLog([NSString stringWithFormat:@"%@", [entry objectForKey:@"x"]]); 
+2

En una nota relacionada, el [NSString stringWithFormat:] bit es innecesaria y potencialmente dañina. Debería llamar a NSLog así: NSLog (@ "% @", [entry objectForKey: @ "x"]) ;. El primer parámetro para NSLog es una cadena de formato, que casi siempre debe ser literal. –

Respuesta

103

Usted está intercambiando el orden en que se inserta objetos y clave: es necesario insertar primero el objeto, a continuación, la tecla como se muestra en el siguiente ejemplo.

NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:@"value1", @"key1", @"value2", @"key2", nil]; 
+1

Si sus valores se colocan dinámicamente, preste especial atención si los valores son nulos. Esto puede hacer que la creación de tu diccionario se detenga en el medio, ya que 'nil' es un centinela en el envío de métodos. Haz una validación si es necesario. 'NSDictionary * dict = [[alloc] initWithObjectsAndKeys NSDictionary: @ "valor1" nula: @ "" @ "key1", @ "valor2?" Nula:? @ "" @ "Clave2", nil];' –

5

NSDictionary Sintaxis:

NSDictionary *dictionaryName = [NSDictionary dictionaryWithObjectsAndKeys:@"value1",@"key1",@value2",@"key2", nil]; 

Ejemplo:

NSDictionary *importantCapitals = [NSDictionary dictionaryWithObjectsAndKeys: 
@"NewDelhi",@"India",@"Tokyo",@"Japan",@"London",@"UnitedKingdom", nil]; 
NSLog(@"%@", importantCapitals); 

de salida el aspecto de,

{India = NewDelhi; Japón = Tokio; UnitedKingdom = Londres; }

14

nuevo Objective-c admite esta nueva sintaxis para la inicialización estática.

@{key:value} 

Por ejemplo:

NSDictionary* dict = @{@"x":@(acceleration.x), @"y":@(acceleration.y), @"z":@(acceleration.z), @"date":[NSDate date]}; 
+0

' [NSNumber numberWithDouble: acceleration.x] 'también se puede escribir más corto como' @ (acceleration.x) ' –

+0

@ Sega-Zero Thanks. Actualicé la respuesta. – Nemo

+0

esta sintaxis es excelente para trabajar con JSON – EFE