Swift CKRecord setValue:forKey或setObject:forKey

Swift CKRecord setValue:forKey或setObject:forKey,swift,cloudkit,ckrecord,Swift,Cloudkit,Ckrecord,Swift中的CKRecord类规范要求使用setObject:forKey:设置CKRecord的值。但是我看到了很多使用setValue:forKey:的代码示例,这是NSValueCoding协议的一部分。那么有人能解释一下一个比另一个有什么好处吗?不幸的是setValue:经常被误用 简单规则: 为密钥/值集合类型中的密钥设置对象的指定方法是setObject:或密钥订阅。 setValue:是一种具有特殊意义的键值编码方法。例如,可以使用一行同时设置数组中所有词典(或自定义对象)的相同

Swift中的
CKRecord
类规范要求使用
setObject:forKey:
设置
CKRecord
的值。但是我看到了很多使用
setValue:forKey:
的代码示例,这是
NSValueCoding
协议的一部分。那么有人能解释一下一个比另一个有什么好处吗?

不幸的是
setValue:
经常被误用

简单规则:

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

setValue:
是一种具有特殊意义的键值编码方法。例如,可以使用一行同时设置数组中所有词典(或自定义对象)的相同属性<代码>设置值:也可用于通过文本键而不是使用适当的设置器来设置自定义类中的属性

例如语法

object.name = "foo"

基本上是一样的

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

编辑:

总结(引用rmaddy的精彩评论,谢谢):


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

不幸的是
setValue:
经常被误用

简单规则:

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

setValue:
是一种具有特殊意义的键值编码方法。例如,可以使用一行同时设置数组中所有词典(或自定义对象)的相同属性<代码>设置值:也可用于通过文本键而不是使用适当的设置器来设置自定义类中的属性

例如语法

object.name = "foo"

基本上是一样的

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

编辑:

总结(引用rmaddy的精彩评论,谢谢):


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

tl;dr-只有当您明确、具体地需要使用key-value-coding.tl时,才使用
setValue:forKey:
;dr-只有在明确、具体需要使用键值编码时,才使用
setValue:forKey: