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

+2

删除中文字符,这真的没有必要,英文是人们在这里使用的。并且真的不需要多个'!'字符。清晰并且格式良好的问题会得到答案。 –

+0

[的setValue:forUndefinedKey:] – charlin

你已经完美解决了这个问题。您不能在可选的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的解决方案都可以通过其他更好的方法来完成。

  • +0

    哦,不,但是,我再次测试一个字符串可选性能及用途KVC,它的工作很好....... 类Person:NSObject的{ 变种名称:字符串? } 然后 – charlin

    +0

    哦,不,但是,我再次测试一个字符串可选性能及用途KVC,它的工作很好....... 变数名称:字符串? var person = Person() person.setValue(“张三”,forKeyPath:“name”) – charlin

    +0

    但不是'Int?'。如果你真的需要这是一个可选的,使用'NSNumber?'。 – matt