2013-08-09 21 views
6

Bir Nested NSDictionary için yeni anahtarlar oluşturmakta sorun yaşıyorum.Yuvalanmış NSDictionary'ye anahtarlar ekleme

, Şimdi başka kök anahtarı ve Bunu yapan yuvalanmış anahtarı eklemek için

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

: İşte ben NSLogs

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

NSMutableDictionary

bu tür var

yapmış ne
[Ga setObject:@{@"SubNode21" : @555} forKey:@"Node2"]; 

Artık NSLog çıkışları:

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

Varolan Düğüme başka bir anahtar eklemem gerekiyor, örneğin SubNode22 = 345; '- [__ NSDictionaryI setObject: forKey:]: kodunun ayrı çizgide Node2 için, bu yüzden bu

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

çalışmak Fakat uygulamayı Sonlandırma bu şov hata" nedeniyle yakalanmamış istisna 'NSInvalidArgumentException', akıl için düşündük tanınmayan seçici "örneğe"

Problemin ne olduğunu anlamıyorum, bu yöntem bana doğru geliyor gibi görünüyor.

+0

böyle bir şey yapmak gerekir '- [__NSDictionaryI setObject: forKey:]: örneğe gönderilen tanınmayan seçici - bu ne anlama geliyor? NSDictionary için spesifikasyona bakın ve 'setObject' desteklediği bir yöntem olup olmadığını görün. –

cevap

8

Buradaki problemin yuvalama ile ilgisi yoktur. Değişmez ayetle ilgisi var. Sözlük değişmezse, ekleyemezsiniz.

Hata iletisi, NSDictionary'un setObject:ForKey: adlı bir yönteme sahip olmadığını söylüyor çünkü bu, NSMutableDictionary yöntemidir. Elmalar yeni edebi sözlükler @{ key: object} kullanarak sadece değişmez sözlükler oluşturur.

Yani aslında ne gerek ya Yani burada [NSMutableDictionary dictionaryWithObjectsAndKeys:]; veya [@{ Key: Object } mutableCopy]

kodunuzu

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

Hala yeni indislemenin bazılarını kullanabilirsiniz değişti kullanılarak NSMutableDictionary s oluşturulan konum emin olmaktır özellikler olsa da. Bu aynı şeyler yapmak daha okunabilir şu gibi Örneğin siz bir şeye kodunu değiştirebilirsiniz:

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

Çözüm için teşekkürler, ben gerçekten tüm sorun neden iç içe sözlük tanımlamak için dictionarywithDictionary yaptım fark etmedi. Sorunu çözmek için yaptığım şey, iç içe geçmiş sözlüğün nesnelerini ve değerlerini ayrı ayrı ekleyen ve son olarak bu sözlük nesnesini orijinal sözlüğe ekleyen başka bir MutableDictionary yarattım. Çözümü üzerinde çalışırken problemi fark etmemek için aptalca davrandım: P –

+0

Sorun Yok, Mutlu Kodlama :) –

2

sorun dış Sözlük bir NSMutableDictionary olmakla iç olanlar (olanlar sadece @{} sözdizimi ile oluşturulan olmasıdır) immutable NSDictionaries vardır. Bunları açıkça tüm değişkenler haline getirmeniz gerekecek.

0

Burada sorun, sözdizimi sözdizimi (@{...} sözdizimi) bir NSDictionary üretir - aslında ihtiyacınız olan bir NSMutableDictionary. (NSDictionary sınıf değişmez; setObject:forKey: yöntem NSMutableDictionary alt sınıfta sadece mevcut, sen istisna alıyoruz olmasını sağlıyor.) Sorunu gidermek için

[Ga setObject:[NSMutableDictionary dictionaryWithDictionary:@{@"SubNode21" : @555}] 
     forKey:@"Node2"]; 
İlgili konular