它似乎是一个比Objective-C更新的超集,点符号的组合与指令混合,例如:studentsInClassA.@union.studentsInClassB.pets(...)
和合规性语法,例如:-replaceObjectIn<Key>AtIndex:withObject:
。似乎KVC的很大一部分类似于简单的存取方法,无论如何都可以合成。但是,我会说KVObserving似乎使MVC应用程序更容易。意见?
答案 0 :(得分:4)
键值编码允许您查找任意嵌套的属性,这些属性的标识仅在运行时已知。例如,KVC不是person.name
的良好替代品 - 对于这样一个特定任务来说它是不必要的通用。但是,假设我们在编写程序时不知道我们是否想要查找姓名,年龄或最喜欢的鞋品牌。我们经常使用NSTableView数据源遇到这种情况。我们可以编写一个重要的重复条件来发送我们想要的消息,但KVC可以轻松实现:
return [personController.selectedPerson valueForKeyPath:desiredAttribute];
然后我们可以将desiredAttribute
设置为@"name"
,@"age"
或@"favoriteShoeBrand.name"
,即使我们只知道我们想要的属性,我们也会获得正确的值而不会分支运行时。
它也很有用,因为类可以以特殊方式处理KVC。例如,NSArray做了一件非常好的事情。 [arrayOfPeople valueForKeyPath:@"name"]
不等同于arrayOfPeople.name
- 而是将密钥路径传递给每个对象并创建一个新数组,其结果是这样做。因此它与许多其他语言中的map函数具有相同的用途。还有一些特殊的KVC运算符,例如@distinctUnionOfArrays
(它采用数组的集合并将它们合并在一起,忽略重复),这使得对嵌套集合的操作比以往更加简洁。
至于KVO,它只是一种在发生变化时收到通知的方式 - 例如,您可以在一个人的生日时更新您的UI,而不需要UI了解生日逻辑。如果这对您有用,您可能会喜欢它。