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