我发现在Swift中使用KVC会导致许多问题,特别是对于可选属性。
这是我的具体问题:
这是一个名为 Person 的类。它有一个名为 age 的普通属性,以及一个名为 ageOptional 的Optional(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-07-11 11:17:31.546 CFRuntime [4646:607] ***因未捕获的异常终止应用程序' NSUnknownKeyException',原因:' [setValue:forUndefinedKey:]: 对于关键ageOptional,此类不符合键值编码。'
我发现,如果属性是可选的,KVC无法找到密钥。但是,我无法找到可选属性的有用键,并解决了这种情况。
答案 0 :(得分:1)
你已经完全解决了这个问题。您不能在Optional Int属性上使用KVC,因为KVC是Cocoa / Objective-C,而Objective-C看不到可选Int - 它没有桥接到Objective-C。 Objective-C只能看到桥接到Objective-C的类型:
从NSObject
使用DT[am == 1 & (gear == 3 | gear == 4) & (carb == 4 | carb == 2)]
桥接的Swift结构
Objective-C也可以看到一个Optional包装任何这些类型 - 差不多。它可以看到一个可选的包装桥接结构,但只有当该结构直接桥接时。 Int 不直接桥接;它是桥接到NSNumber,但不是直接(它必须被包装)。因此,Objective-C无法看到键入为@objc
的Swift成员。
如果您真的需要这个是可选项,并且如果您确实需要在其上使用KVC,请将其声明为Int?
,而不是NSNumber?
。就个人而言,我怀疑这些事情是否属实;由于我将所有应用程序从Objective-C转换为Swift,我发现我实际上并不需要内部的KVC,并且所有基于KVC的解决方案都可以通过其他更好的方式完成。