CKRecord setValue:forKey 或 setObject:forKey

Posted

技术标签:

【中文标题】CKRecord setValue:forKey 或 setObject:forKey【英文标题】:CKRecord setValue:forKey or setObject:forKey 【发布时间】:2016-06-05 15:44:03 【问题描述】:

Swift 中的CKRecord 类规范说使用setObject:forKey: 来设置CKRecord 的值。但是我看到很多带有setValue:forKey: 的代码示例,它是NSValueCoding 协议的一部分。那么有人可以解释一下两者相比有什么优势吗?

【问题讨论】:

【参考方案1】:

很遗憾,setValue:非常经常被滥用。

简单规则:

为键/值集合类型中的键设置对象的指定方法是setObject:或键订阅。

setValue:是一种具有特殊含义的key-value-coding方法。例如,您可以用一行同时设置数组中所有字典(或自定义对象)的相同属性。 setValue: 也可用于通过文字键而不是使用适当的设置器来设置自定义类中的属性。

例如语法

object.name = "foo"

object.setValue("foo", forKey:"name")

基本一样。

使用setValue: 的一个例外是NSManagedObject,因为这个类严重依赖键值编码。

编辑:

总结(rmaddy优秀评论的字面引用,谢谢):

只有在您有明确、具体的需要使用键值编码时才使用setValue:forKey:

【讨论】:

tl;dr - 仅当您明确、具体需要使用键值编码时才使用 setValue:forKey:

以上是关于CKRecord setValue:forKey 或 setObject:forKey的主要内容,如果未能解决你的问题,请参考以下文章

自定义核心数据访问器——setValue:forKey: vs. setPrimitiveValue:forKey:

NSMutableArray 的 setValue:forKey: 和 setObject:forKey: 有啥区别?

iPhone - setValue:forkey: 未记录

setObject:forKey和setValue:forKey的区别

iphone:setObject:forKey:和setValue:forKey:在将条目添加到可变字典中的区别是啥[重复]

具有 NSObject 继承的泛型类,self.setValue(, forKey:) 不起作用