2013-08-09 51 views
6

ネストされたNSDictionaryの新しいキーを作成する際に問題が発生しています。ネストされたNSDictionaryにキーを追加する

、今すぐ別のルートキーと、私はこれをしなかった、ネストされたキーを追加する

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

:ここで私は私がようNSLogs

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

NSMutableDictionary

のこの種を持っている

を行っているものです
[Ga setObject:@{@"SubNode21" : @555} forKey:@"Node2"]; 

NSLog出力:

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

既存のノードに別のキー、たとえばSubNode22 = 345を追加する必要があります。コードの別の行にノード2のために、私は、これは

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

しかし、キャッチされない例外により 『NSInvalidArgumentException』、理由にアプリを終了、このショーのエラー」うまくいくかもしれないと思った:「 - [__ NSDictionaryIのsetObject:forKeyを:]:認識されませんセレクタがインスタンスに送信されました "

私は問題は何もありません、この方法はまっすぐ私には思われる..任意の解決してください。

+0

ような何かをする必要があります ' - [__NSDictionaryI setObject:forKey:]:インスタンスに送信された認識できないセレクタ ' - それはどういう意味ですか? NSDictionaryの仕様を調べて、 'setObject'がサポートしているメソッドであるかどうか確認してください。 –

答えて

8

ここでの問題は、ネストすることとは関係ありません。変更可能な詩は不変でなければなりません。辞書が変更できない場合は、追加することはできません。

NSDictionaryには、のメソッドであるsetObject:ForKey:というメソッドがありませんというエラーメッセージが表示されます。 Applesを使用すると、新しいリテラル辞書@{ key: object}は不変の辞書のみを作成します。

それでは、あなたが実際に必要なのは、あなたがそうここ[NSMutableDictionary dictionaryWithObjectsAndKeys:];または[@{ Key: Object } mutableCopy]

のいずれかを使用してNSMutableDictionary Sを作成していることを確認することですあなたのコードは、あなたがまだ新しい添字の一部を使用することができます

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

を変更しています機能はしかし。たとえば、あなたがこのような何かにコードを変更することができ、同じことをやって、より読みやすいのthats:

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

ソリューションをありがとう、私は本当にdidnot通知すべての問題を引き起こした入れ子の辞書を定義するdictionarywithDictionaryを行った。私が問題を解決するためにしたのは、オブジェクトとネストされた辞書の値を別々に追加し、最後にこの辞書オブジェクトを元の辞書に追加した別のMutableDictionaryを作成したことです。 –

+0

いいえ問題、ハッピーコーディング:) –

2

問題は、あなたの外側の辞書はNSMutableDictionaryであるということですが、あなたの内なるものばかり@{}構文で作成された(もの)は不変のNS辞書です。明示的にそれらをすべて変更可能にする必要があります。

0

ここでの問題は、リテラル辞書の構文(@{...}構文)がNSDictionaryを生成することです。実際に必要なのはNSMutableDictionaryです。 (NSDictionaryクラスは不変であり、setObject:forKey:方法はNSMutableDictionaryサブクラスにのみ存在する、あなたは例外を取得している理由である。)問題を解決するには、あなたが

[Ga setObject:[NSMutableDictionary dictionaryWithDictionary:@{@"SubNode21" : @555}] 
     forKey:@"Node2"]; 
関連する問題