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



>我有这样的对象:

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 数据类型的此错误:

由于

未捕获的异常"NSUnknownKeyException"而终止应用程序,原因:"[ setValue:forUndefinedKey:]:this 类不符合密钥年龄的键值编码。

为什么会这样?
以及如何解决这个问题,因为我需要使用 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
    }
}

最新更新