Objective-C:forKey和forKeyPath有什么区别?

时间:2012-07-11 13:33:40

标签: objective-c ios

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);
}

3 个答案:

答案 0 :(得分:7)

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

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

另一方面,指定关键路径遵循通过对象的路径。如果您有字典词典,则可以使用"key1.key2"之类的关键路径在第二级中查找元素。

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

修改以回答不应使用valueForKey:的原因:

  1. valueForKey:仅适用于字符串键。字典可以使用其他对象作为键。
  2. valueForKey:以不同的方式处理以“@”字符开头的键。您无法访问密钥以@开头的元素。
  3. 最重要的是:使用valueForKey:你会说:“我正在使用KVC”。应该有这样做的理由。使用objectForKey:时,您只是通过自然的预期API访问字典中的元素。

答案 1 :(得分:3)

Apple文档:NSKeyValueCoding Protocol Reference

<强>的setValue:forKey:

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

示例:

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

<强>的setValue:forKeyPath:

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

示例:

[foo setValue:@"The quick brown fox" forKeyPath:@"bar.stringOnBar"];

答案 2 :(得分:1)

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

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

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