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

What the difference between setValue and myObject.propertyName in iOS Swift 3.1?

我有这样的对象:

class Human: NSObject {
    var name:String!
    var age:Int!
}

然后像这样从对象创建实例:

let instance = Human()  

然后像这样设置我的值:

instance.name = "Kirk"
instance.age = 87

然后像这样打印:

print("name: \(instance.name)") // Kirk
print("age: \(instance.age)") //87

一切都很好。但现在以另一种方式设置我的价值观:

instance.setValue("Kirk", forKey: "name")
instance.setValue(87, forKey: "age")

Int 数据类型出现此错误:

*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key age.'

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

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

如果添加显式 dynamic 属性,您会看到编译错误:

class Human: NSObject {
    var name:String!   
    dynamic var age: Int!
}

它将与 Int 一起使用。

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

Int! 不能像其他提到的那样表示为 int Objective-C。这应该有效

class Human: NSObject {
    var name:String!
    var age : Int;

    init(name:String?, age:Int) {
        self.age = age
        self.name = name
    }
}