2009-07-10 18 views
29

Im folgenden Code zeigt die erste Protokollanweisung eine Dezimalzahl wie erwartet, aber die zweite protokolliert NULL. Was mache ich falsch?Erstellen eines 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

auf einer nicht verwandte Notiz, die [NSString string:] Bit ist nicht notwendig und potenziell schädlich. Sie sollten NSLog wie folgt aufrufen: NSLog (@ "% @", [entry objectForKey: @ "x"]) ;. Der erste Parameter für NSLog ist eine Formatzeichenkette, die fast immer ein Literal sein sollte. –

Antwort

103

Sie tauschen die Reihenfolge, in der Objekte und Schlüssel einfügen: Sie zuerst das Objekt einfügen müssen, dann den Schlüssel, wie im folgenden Beispiel gezeigt.

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

Wenn Ihre Werte dynamisch platziert werden, sollten Sie besonders darauf achten, dass alle Werte null sind. Dies kann dazu führen, dass die Erstellung Ihres Wörterbuchs in der Mitte aufhört, da "nil" beim Methodenversand festgelegt wird. Führen Sie bei Bedarf eine Validierung durch. 'NSDictionary * dict = [[NSDictionary Alloc] initWithObjectsAndKeys: @" Wert1 "? Nil: @" ", @" Schlüssel1 ", @" Wert2 "? Nil: @" ", @" Schlüssel2 ", Nil];' –

5

NSDictionary Syntax:

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

Beispiel:

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

Ausgang suchen, wie,

{Indien = NewDelhi; Japan = Tokio; Vereinigtes Königreich = London; }

14

neues Objective-c unterstützt diese neue Syntax für die statische Initialisierung.

@{key:value} 

Zum Beispiel:

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

' [NSNumber numberWithDouble: acceleration.x] 'kann auch kürzer geschrieben werden als' @ (acceleration.x) ' –

+0

@ Sega-Zero Thanks. Ich habe die Antwort aktualisiert. – Nemo

+0

Diese Syntax eignet sich hervorragend für die Arbeit mit JSON – EFE