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
}
}
我有这样的对象:
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
}
}