2013-08-09 6 views
6

Ich habe Probleme beim Erstellen neuer Schlüssel für ein Nested NSDictionary. Hier ist, was ich habeHinzufügen von Schlüsseln zu Nested NSDictionary

getan

Ich habe diese Art von NSMutableDictionary

NSMutableDictionary *Ga=[NSMutableDictionary dictionaryWithDictionary:@{@"Node1" :@{@"SubNode11" :@40,@"SubNode12":@30}}]; 

Welche NSLogs als:

Node1 =  { 
    SubNode11 = 40; 
    SubNode12 = 30; 
}; 

nun eine weitere Stammschlüssel und eine verschachtelte Schlüssel hinzuzufügen ich dies tat,

[Ga setObject:@{@"SubNode21" : @555} forKey:@"Node2"]; 

Jetzt die NSLog-Ausgänge:

Node1 =  { 
    SubNode11 = 40; 
    SubNode12 = 30; 
}; 
Node2 =  { 
    SubNode21 = 555; 
}; 
} 

Ich muss einen weiteren Schlüssel zu einem vorhandenen Knoten hinzufügen, sagen wir SubNode22 = 345; für Node2 in einer separaten Zeile Code, so dachte ich, das

funktionieren könnte
[[Ga objectForKey:@"Node2"] setObject:@5555 forKey:@"SubNode22"]; 

Aber diese Show Error „Beenden app aufgrund nicht abgefangene Ausnahme 'NSInvalidArgumentException', Grund:‚- [__ NSDictionaryI setObject: forKey:]: unerkannt Selektor an Instanz gesendet "

Ich nicht, was das Problem ist, scheint diese Methode direkt zu mir .. Jede Lösung bitte.

+0

'tun müssen - [__NSDictionaryI setObject: forKey:]: unerkannter Selektor an Instanz gesendet - was heißt das? Schlagen Sie die Spezifikation für NSDictionary nach und sehen Sie, ob 'setObject' eine Methode ist, die es unterstützt. –

Antwort

8

Das Problem hier hat nichts mit Verschachtelung zu tun. Es hat mit veränderlichen Versen unveränderlich zu tun. Wenn das Wörterbuch nicht änderbar ist, können Sie es nicht hinzufügen.

Die Fehlermeldung sagt Ihnen, dass NSDictionary keine Methode namens setObject:ForKey: haben, denn das ist eine Methode von NSMutableDictionary. Mit Apple neue literale Wörterbücher @{ key: object} erstellt nur unveränderliche Wörterbücher.

Also, was Sie wirklich brauchen, ist sicherzustellen, dass Sie erstellt sind NSMutableDictionary s entweder [NSMutableDictionary dictionaryWithObjectsAndKeys:]; oder [@{ Key: Object } mutableCopy]

So, hier ist der Code verändert

NSMutableDictionary *subNode = [NSMutableDictionary dictionaryWithObjectsAndKeys:@40, @"SubNode11", @30, @"SubNode12", nil]; 
NSMutableDictionary *Ga = [NSMutableDictionary dictionaryWithObjectsAndKeys:subNode, @"Node 1", nil]; 
[Ga setObject:[NSMutableDictionary dictionaryWithObjectsAndKeys:@555, @"SubNode21", nil] forKey:@"Node2"]; 
[[Ga objectForKey:@"Node2"] setObject:@5555 forKey:@"SubNode22"]; 

Sie können immer noch einige der neuen Subskribierung verwenden Funktionen obwohl. Zum Beispiel können Sie den Code, um etwas zu ändern, wie dies besser lesbar das ist die gleichen Dinge tun:

NSMutableDictionary *Ga = [NSMutableDictionary dictionary]; 

// Create SubNodes 
NSMutableDictionary *subNode1 = [NSMutableDictionary dictionary]; 
subNode1[@"SubNode11"] = @40; 
subNode1[@"SubNode12"] = @30; 

NSMutableDictionary *subNode2 = [NSMutableDictionary dictionary]; 
subNode2[@"SubNode21"] = @555; 

// Set SubNodes to Main Node Container 
Ga[@"Node1"] = subNode1; 
Ga[@"Node2"] = subNode2; 

// Set a nested subnode's value. 
Ga[@"Node2"][@"SubNode22"] = @5555; 
+0

Vielen Dank für die Lösung, ich habe wirklich nicht bemerkt, dass ich DictionarywithDictionary verwendet, um das verschachtelte Wörterbuch zu definieren, das all das Problem verursacht hat. Was ich getan habe, um das Problem zu lösen, ist, dass ich ein anderes MutableDictionary erstellte, das die Objekte und Werte des verschachtelten Wörterbuchs separat hinzufügte und schließlich dieses Wörterbuchobjekt dem ursprünglichen Wörterbuch hinzufügte. Ich war dumm genug, das Problem nicht zu erkennen, wenn ich an der Lösung arbeitete: P –

+0

Kein Problem, Happy Coding :) –

2

Das Problem ist, dass Ihr Außen Wörterbuch ist ein NSMutableDictionary, aber Ihre inner diejenigen (die, die nur mit der @{} Syntax erstellt) sind unveränderliche NS-Wörterbücher. Sie müssen sie explizit alle veränderbar machen.

0

Das Problem hier ist, dass die wörtliche Wörterbuchsyntax (die @{...}-Syntax) eine NSDictionary produziert - was Sie tatsächlich brauchen, ist ein NSMutableDictionary. (Die NSDictionary Klasse ist unveränderlich, die setObject:forKey: Methode nur in der NSMutableDictionary Unterklasse ist, das ist, warum Sie die Ausnahme zu bekommen.), Um das Problem zu beheben, werden Sie so etwas wie

[Ga setObject:[NSMutableDictionary dictionaryWithDictionary:@{@"SubNode21" : @555}] 
     forKey:@"Node2"]; 
Verwandte Themen