iOS Swift 3.1中setValue和myObject.propertyName有什么区别?

rez*_*afi 1 int key-value-coding ios swift

我有这样的对象:

class Human: NSObject {
    var name:String!
    var age:Int!
}
Run Code Online (Sandbox Code Playgroud)

并从这样的对象生成实例:

let instance = Human()  
Run Code Online (Sandbox Code Playgroud)

并设置我的值如下:

instance.name = "Kirk"
instance.age = 87
Run Code Online (Sandbox Code Playgroud)

并打印出来像这样:

print("name: \(instance.name)") // Kirk
print("age: \(instance.age)") //87
Run Code Online (Sandbox Code Playgroud)

一切都好.但是现在用另一种方式设置我的值:

instance.setValue("Kirk", forKey: "name")
instance.setValue(87, forKey: "age")
Run Code Online (Sandbox Code Playgroud)

获取Int dataType的此错误:

***由于未捕获的异常'NSUnknownKeyException'终止应用程序,原因:'[setValue:forUndefinedKey:]:此类不是密钥时代的密钥值编码兼容.

为什么会这样?
以及如何解决这个问题,因为我需要使用setValue()函数.

Sul*_*han 6

键值编码(KVC)依赖于Objective-C功能,Int!类型在技术上是可选的值类型.可选值类型无法在Objective-C中表示,这就是调用失败的原因.

如果添加显式dynamic属性,则可以看到编译错误:

class Human: NSObject {
    var name:String!   
    dynamic var age: Int!
}
Run Code Online (Sandbox Code Playgroud)

它可以使用Int.

无论如何,在这种情况下使用隐式展开的选项是一个坏主意.您应该将属性作为非选项并在初始化程序中初始化它们.