2013-08-09 9 views
6

Mam problemy z tworzeniem nowych kluczy dla zagnieżdżonego NSDictionary. Oto co mam zrobićDodawanie kluczy do Nested NSDictionary

mam tego rodzaju NSMutableDictionary

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

Które NSLogs jak:

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

Teraz, aby dodać kolejny klucz główny i zagnieżdżony klucz Zrobiłem to,

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

Teraz wyjścia NSLog:

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

Potrzebuję dodać inny klucz do istniejącego węzła, powiedz SubNode22 = 345; dla Node2 w osobnej linii kodu, więc pomyślałem, że to może działać

[[Ga objectForKey:@"Node2"] setObject:@5555 forKey:@"SubNode22"]; 

Ale ten pokaz Error „Zakończenie aplikację spowodowane nieprzechwyconego wyjątku 'NSInvalidArgumentException', powód:„- [__ NSDictionaryI setObject: forKey:]: nierozpoznany selektor wysłany do instancji "

Nie mam problemu, ta metoda wydaje mi się prosta. Wszelkie rozwiązanie proszę.

+0

'- [__NSDictionaryI setObject: forKey:]: nierozpoznany selektor wysłany do instancji' - co to znaczy? Wyszukaj specyfikację dla NSDictionary i zobacz, czy 'setObject' jest obsługiwaną metodą. –

Odpowiedz

8

Problem tutaj nie ma nic wspólnego z zagnieżdżaniem. Ma do czynienia z zmiennym wersetem niezmiennym. Jeśli słownik nie jest zmienny, nie można go dodać.

Komunikat o błędzie informujący, że NSDictionary nie ma metody o nazwie setObject:ForKey:, ponieważ jest to metoda NSMutableDictionary. Używanie jabłek nowe słowniki literowe @{ key: object} tworzy wyłącznie niezmienne słowniki.

Więc co rzeczywiście potrzebne jest, aby upewnić się, że tworzony NSMutableDictionary s stosując albo [NSMutableDictionary dictionaryWithObjectsAndKeys:]; lub [@{ Key: Object } mutableCopy]

Więc tutaj jest kod zmienił

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"]; 

Można nadal korzystać z niektórych nowych indeksowanie funkcje jednak. Na przykład można zmienić kod na coś takiego to jest to bardziej czytelne robi te same rzeczy:

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

Dziękuję za rozwiązanie, naprawdę nie zauważyłem, że zrobiłem dictionarydithDictionary, aby zdefiniować zagnieżdżony słownik, który spowodował cały problem. To, co zrobiłem, aby rozwiązać problem, to stworzyłem inny MutableDictionary, który osobno dodawał obiekty i wartości zagnieżdżonego słownika i wreszcie dodał ten słownikowy słownik do oryginalnego słownika. Głupio było mi nie uświadomić sobie problemu podczas pracy nad rozwiązaniem: P –

+0

Bez problemu, Happy Coding :) –

2

Problemem jest to, że zewnętrzna Słownik jest NSMutableDictionary, ale swoje wewnętrzne nich (te tworzone tylko składni w @{}) są niezmiennymi NSDictionaries. Musisz jawnie ustawić je wszystkie jako zmienne.

0

Problem polega na tym, że dosłowna składnia słownika (składnia @{...}) wytwarza NSDictionary - czego faktycznie potrzebujesz, to NSMutableDictionary. (Klasa NSDictionary jest niezmienna; metoda setObject:forKey: jest obecna tylko w NSMutableDictionary podklasy, dlatego dostajesz wyjątek). Aby rozwiązać ten problem, musisz zrobić coś takiego

[Ga setObject:[NSMutableDictionary dictionaryWithDictionary:@{@"SubNode21" : @555}] 
     forKey:@"Node2"]; 
Powiązane problemy