问题
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
@objcSwift 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