使用KVC的Swift可选属性会导致崩溃

时间:2015-07-11 03:22:48

标签: swift optional kvc

我发现在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无法找到密钥。但是,我无法找到可选属性的有用键,并解决了这种情况。

1 个答案:

答案 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的解决方案都可以通过其他更好的方式完成。