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

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

2
只有在使用更复杂的字典(具有多个级别)时才会有所不同。你们的看起来一样的原因是,只有一个元素的键路径(没有“.”表示附加路径组件)实际上只是一个键。 - Dustin
3个回答

8
这两种方法都是 Key-Value Coding 的一部分,通常不应该用于字典中的元素访问。它们只适用于类型为NSString的键,并且需要特定的语法。
两者之间的区别在于,指定一个(单个)键只会查找该项。
另一方面,指定键路径会沿着对象路径进行查找。如果您有一个字典嵌套了其他字典,则可以使用类似于"key1.key2"的键路径来查找第二层中的元素。
如果您只想访问字典中的元素,则应使用objectForKey:setObject:forKey:编辑回答为什么不应使用valueForKey:
  1. valueForKey:仅适用于字符串键。字典可以使用其他对象作为键。
  2. valueForKey:以不同的方式处理以“@”字符开头的键。您无法访问以@开头的键的元素。
  3. 最重要的是:通过使用valueForKey:,您正在表明:“我正在使用KVC”。这样做应该有一个理由。当使用objectForKey:时,您只是通过自然的、预期的API访问字典中的元素。

1
只是出于好奇,为什么不应该在字典中使用valueForKey:方法? - Monolo

3

苹果文档:NSKeyValueCoding协议参考

setValue:forKey:

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

示例:

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

setValue:forKeyPath:

该方法用于将指定的值赋给通过给定键路径标识的属性。

示例:

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

1
此外,在使用“setValue:forKeyPath:”时,请确保keyPath处的对象存在。如果为nil,则该方法将静默失败,因为路径不完整。 - ezekielDFM

0

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

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

虽然这只是一个有点牵强的例子。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接