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

这两种方法都是键值编码的一部分,通常不应用于字典中的元素访问。它们仅适用于类型的键NSString并且需要特定的语法。

它们两者之间的区别在于指定(单个)键只会查找该项目。

另一方面,指定关键路径遵循通过对象的路径。如果你有一个字典字典,你可以使用"key1.key2".

如果您只想访问字典中的元素,您应该使用objectForKey:and setObject:forKey:

编辑回答为什么valueForKey:不应该使用:

  1. valueForKey:仅适用于字符串键。字典可以使用其他对象作为键。
  2. valueForKey:以不同方式处理以“@”字符开头的键。您不能访问键以 开头的元素@
  3. 最重要的是:通过使用valueForKey:你是在说:“我正在使用 KVC”。这样做应该是有原因的。使用时,objectForKey:您只是通过自然的、预期的 API 访问字典中的元素。
于 2012-07-11T13:44:49.033 回答
3

Apple 文档:NSKeyValueCoding 协议参考

设置值:forKey:

将给定键指定的接收器的属性设置为给定值。

例子:

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

设置值:forKeyPath:

将由给定键路径标识的属性的值设置为给定值。

例子:

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

keyPath可用于遍历任意对象路径,只要它们实现NSKeyValueCoding. 他们不需要是NSDictionarys。例如:

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

虽然这是一个人为的例子。

于 2012-07-11T13:57:09.630 回答