我在兼容 NSKeyValueCoding 的 Swift NSObject 子类中成功地使用了 setValue(value, forKey: key)
方法。
这在 String optionals 上非常有效,例如
var name:String?
但是,在 Int optionals 上,它失败了,触发了我为调试目的而重写的未定义键方法:
override func setValue(value: AnyObject!, forUndefinedKey key: String!) {
println("\(self) this class is not key value coding-compliant for the key \(key)")
}
因此,例如,具有良好整数值的 myId
键将触发上面未定义的键方法。
var myId:Int?
如果我将上面的定义更改为非可选的,那么一切正常:
var myId:Int = 0
将 myId
作为可选项,我已经尝试了所有我能想到的转换、展开、初始化等方式。它只是没有将类视为符合这些数值的键值。
我知道这是一个很好的数值。将 var 声明更改为 String?崩溃。它在 lldb 中看起来也不错:
Printing description of key:
myId
key NSObject 0x00007fb8d530ca20 0x00007fb8d530ca20
k NSString "myId" 0x00007fa2aa942f20
value __NSCFNumber * Int64(4348129) 0xb000000004258e13
Printing description of value:
4348129
(lldb)
所以,问题是,有没有人在 Swift 中成功地使用了 NSKeyValueCoding 方法 setValue(value, forKey: key)
Int 类型?
最佳答案
KVO 不能使用纯 Swift 可选值,因为纯 Swift 可选值不是 Objective-C 对象。 Swift 禁止使用 dynamic
或 @objc
使用通用类和结构,因为没有有效的 Objective-C 等价物,因此运行时未设置为在这些类型的对象的实例上支持 KVO。至于为什么它适用于 String?
, 该类型是免费桥接到 NSString
, 所以它在语义上等同于 NSString *
,运行时完全了解如何处理的 Objective-C 类型。但将其与 Int?
进行比较其语义等价物为 Optional<Int>
, 不是 UnsafePointer<Int>
或 NSNumber *
就像你期望的那样。现在,您需要说服类型检查器使用 NSNumber!
在 Objective-C 中表示是安全的。 .
这是完全倒退的,在我看来,这是类型系统的一个不幸的限制。对于遇到这篇文章的任何工程师,请参阅 rdar://18624182。
关于swift - 使用 setValue(value, forKey : key) on Int? 类型触发非键值编码兼容方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26118811/