【发布时间】:2016-06-05 15:44:03
【问题描述】:
Swift 中的CKRecord 类规范说使用setObject:forKey: 来设置CKRecord 的值。但是我看到很多带有setValue:forKey: 的代码示例,它是NSValueCoding 协议的一部分。那么有人可以解释一下两者相比有什么优势吗?
【问题讨论】:
Swift 中的CKRecord 类规范说使用setObject:forKey: 来设置CKRecord 的值。但是我看到很多带有setValue:forKey: 的代码示例,它是NSValueCoding 协议的一部分。那么有人可以解释一下两者相比有什么优势吗?
【问题讨论】:
很遗憾,setValue:非常经常被滥用。
简单规则:
为键/值集合类型中的键设置对象的指定方法是setObject:或键订阅。
setValue:是一种具有特殊含义的key-value-coding方法。例如,您可以用一行同时设置数组中所有字典(或自定义对象)的相同属性。 setValue: 也可用于通过文字键而不是使用适当的设置器来设置自定义类中的属性。
例如语法
object.name = "foo"
和
object.setValue("foo", forKey:"name")
基本一样。
使用setValue: 的一个例外是NSManagedObject,因为这个类严重依赖键值编码。
编辑:
总结(rmaddy优秀评论的字面引用,谢谢):
只有在您有明确、具体的需要使用键值编码时才使用setValue:forKey:。
【讨论】:
setValue:forKey:。