Swift optional property using KVC causes crash

不问归期 提交于 2019-12-14 03:36:40

问题


I found that using KVC in Swift causes many problems, especially with optional properties.

Here is my specific problem:

Here is a Class named Person. It has a normal property called age,and a Optional(Int) property called ageOptional.

class Person: NSObject {

    var age: Int

    var ageOptional: Int?


    override init(age: Int){

        self.age = 0
    }
}

Now, I use KVC in Person's instance:

//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")

The app crashes, and here is the exception:

2015-07-11 11:17:31.546 CFRuntime[4646:607] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[ setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key ageOptional.'

I found that, if a property is optional, KVC couldn't find the key. But,I can't find the useful key for an optional property ,and resolve this situation.


回答1:


You have already solved the problem perfectly. You cannot use KVC on an Optional Int property, because KVC is Cocoa / Objective-C, and Objective-C cannot see an Optional Int - it is not bridged to Objective-C. Objective-C can only see types that are bridged to Objective-C:

  • class types that are derived from NSObject

  • class types that are exposed with @objc

  • Swift structs that are bridged

Objective-C can also see an Optional wrapping any of those types - almost. It can see an Optional wrapping a bridged struct, but only if that struct is directly bridged. Int is not directly bridged; it is bridged to NSNumber, but not directly (it has to be wrapped). Thus, Objective-C cannot see a Swift member typed as an Int?.

If you really need this to be an Optional, and if you really need to use KVC on it, then declare it as NSNumber?, not Int?. Personally, I would doubt whether either of those things is true; since converting all my apps from Objective-C to Swift, I've found that I don't actually need KVC internally, and that all my KVC-based solutions can be done some other, better way.



来源:https://stackoverflow.com/questions/31353098/swift-optional-property-using-kvc-causes-crash

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!