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);
}
答案 0 :(得分:7)
这两种方法都是Key-Value Coding的一部分,通常不应用于字典中的元素访问。它们仅适用于NSString
类型的键,需要特定的语法。
两者之间的区别在于指定(单个)键只会查找该项目。
另一方面,指定关键路径遵循通过对象的路径。如果您有字典词典,则可以使用"key1.key2"
之类的关键路径在第二级中查找元素。
如果您只想访问字典中的元素,则应使用objectForKey:
和setObject:forKey:
。
修改以回答不应使用valueForKey:
的原因:
valueForKey:
仅适用于字符串键。字典可以使用其他对象作为键。valueForKey:
以不同的方式处理以“@”字符开头的键。您无法访问密钥以@
开头的元素。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"];
虽然这是一个人为的例子。