7

NSMutableDicitionaryのsetValueメソッドのforKeyとforKeyPathの違いは何ですか?私は両方をドキュメントで調べましたが、それらは私には同じように見えました。次のコードを試してみましたが、違いがわかりませんでした。

NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setValue:@"abc" forKey:@"ABC"];
[dict setValue:@"123" forKeyPath:@"xyz"];
for (NSString* key in dict) {
    id val = [dict objectForKey:key];
    NSLog(@"%@, %@", key, val);
}
4

3 に答える 3

8

どちらの方法もKey-Valueコーディングの一部であり、通常、辞書の要素アクセスには使用しないでください。これらはタイプのキーでのみ機能しNSString、特定の構文を必要とします。

両方の違いは、(単一の)キーを指定すると、そのアイテムが検索されるだけであるということです。

一方、キーパスを指定すると、オブジェクトを通るパスに従います。辞書の辞書がある場合は、のようなキーパスを使用して第2レベルの要素を検索できます"key1.key2"

辞書の要素にアクセスしたいだけの場合は、とを使用する必要がobjectForKey:ありsetObject:forKey:ます。

valueForKey:なぜ使用すべきでないのかを答えるために編集してください:

  1. valueForKey:文字列キーに対してのみ機能します。辞書は、キーに他のオブジェクトを使用できます。
  2. valueForKey:「@」文字で始まるキーの処理方法は異なります。キーが。で始まる要素にはアクセスできません@
  3. 最も重要なこと:valueForKey:あなたを使用することによって、「私はKVCを使用しています」と言っています。これを行う理由があるはずです。使用するときobjectForKey:は、自然な意図されたAPIを介して辞書の要素にアクセスするだけです。
于 2012-07-11T13:44:49.033 に答える
3

Appleドキュメント:NSKeyValueCodingプロトコルリファレンス

setValue:forKey:

指定されたキーで指定されたレシーバーのプロパティを指定された値に設定します。

例:

[foo setValue:@"blah blah" forKey:@"stringOnFoo"];

setValue:forKeyPath:

指定されたキーパスによって識別されるプロパティの値を指定された値に設定します。

例:

[foo setValue:@"The quick brown fox" forKeyPath:@"bar.stringOnBar"];
于 2012-07-11T13:42:21.310 に答える
0

keyPathを実装している限り、任意のオブジェクトパスをトラバースするために使用できますNSKeyValueCoding。それらはsである必要はありませんNSDictionary。例えば:

NSString *departmentName = [self valueForKeyPath:@"[person.department.name"];

これは少し不自然な例ですが。

于 2012-07-11T13:57:09.630 に答える