使用KVC的Swift可选属性导致崩溃
我发现在Swift中使用KVC会导致很多问题,尤其是对于可选属性。使用KVC的Swift可选属性导致崩溃
这里是我的具体的问题:
这里是一个名为人类。它有一个名为年龄的常规属性,以及名为ageOptional的可选(Int)属性。
class Person: NSObject {
var age: Int
var ageOptional: Int?
override init(age: Int){
self.age = 0
}
}
现在,我用KVC在人的实例:
//new a instance
var person = Person()
//kvc for normal property: it work well
person.setValue(28, forKeyPath: "age")
//but, this time ,it doesn't work well!!!!
person.setValue(28, forKeyPath: "ageOptional")
应用崩溃了,这里是个例外:
2015年7月11日11:17:31.546 CFRuntime [4646:607] ***由于未捕获的异常'NSUnknownKeyException',原因:'[setValue:forUndefinedKey:]:终止应用程序,该类不是关键值编码兼容关键ageOptional。
我发现,如果一个属性是可选的,KVC找不到密钥。但是,我无法找到可选属性的有用键,并解决了这种情况。
你已经完美解决了这个问题。您不能在可选的Int属性上使用KVC,因为KVC是Cocoa/Objective-C,Objective-C无法看到可选的Int - 它不会桥接到Objective-C。目标C只能看到是桥接到Objective-C的类型:即从NSObject的得出,暴露与@objc
夫特结构
类类型
类类型这是桥接
的Objective-C还可以看到一个可选wrapp几乎所有这些类型。它可以看到一个可选的包装桥接结构,但只有当该结构是直接桥接的。 Int is not直接桥接;它桥接到NSNumber,但不直接(它必须被包装)。因此,Objective-C无法看到类型为Int?
的Swift成员。
如果你确实需要这是一个可选项,并且如果你确实需要使用KVC,那么将其声明为NSNumber?
而不是Int?
。就我个人而言,我怀疑这些事情是否属实;因为将我的所有应用程序从Objective-C转换到Swift,我发现我实际上并不需要KVC内部,并且所有基于KVC的解决方案都可以通过其他更好的方法来完成。
删除中文字符,这真的没有必要,英文是人们在这里使用的。并且真的不需要多个'!'字符。清晰并且格式良好的问题会得到答案。 –
[的setValue:forUndefinedKey:] –
charlin