6

ネストされた NSDictionary の新しいキーの作成に問題があります。これが私がやったことです

私はこの種の NSMutableDictionary を持っています

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

どの NSLogs として:

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

別のルートキーとネストされたキーを追加するために、これを行いました。

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

NSLog は次のように出力します。

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

SubNode22=345 など、既存のノードに別のキーを追加する必要があります。別のコード行でNode2の場合、これでうまくいくと思いました

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

しかし、これはエラー「キャッチされていない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: '-[__NSDictionaryI setObject:forKey:]: 認識されないセレクターがインスタンスに送信されました」

問題が何であるかわかりません。この方法は私には簡単に思えます..どんな解決策もお願いします。

4

3 に答える 3

9

ここでの問題は、ネストとは関係ありません。それは不変の詩と関係があります。ディクショナリが可変でない場合は、追加できません。

エラー メッセージは、は のメソッドであるため、NSDictionary呼び出されたメソッドを持っていないことを示しています。Apple の新しいリテラル ディクショナリを使用すると、不変のディクショナリのみが作成されます。setObject:ForKey:NSMutableDictionary@{ key: object}

したがって、実際に必要なのは、またはのいずれかNSMutableDictionaryを使用して sが作成されていることを確認することです[NSMutableDictionary dictionaryWithObjectsAndKeys:];[@{ Key: Object } mutableCopy]

だからここにあなたのコードが変更されています

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

ただし、新しい添字機能の一部は引き続き使用できます。たとえば、コードを次のように変更して、同じことをより読みやすくすることができます。

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;
于 2013-08-09T17:53:23.603 に答える
2

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

于 2013-08-09T17:54:12.687 に答える
0

ここでの問題は、リテラル辞書構文 (@{...}構文) が -- を生成するNSDictionaryことです。実際に必要なのはNSMutableDictionary. (NSDictionaryクラスは不変です。setObject:forKey:メソッドはサブクラスにのみ存在するためNSMutableDictionary、例外が発生します。)問題を解決するには、次のようなことを行う必要があります

[Ga setObject:[NSMutableDictionary dictionaryWithDictionary:@{@"SubNode21" : @555}]
       forKey:@"Node2"];
于 2013-08-09T17:55:01.423 に答える