swift - 使用 setValue(value, forKey : key) on Int? 类型触发非键值编码兼容方法

标签 swift nsnumber key-value-coding nskeyvaluecoding

我在兼容 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/

相关文章:

cocoa-touch - 为什么 valueForKey : on a UITextField throws an exception for UITextInputTraits properties?

ios - Realm中如何获取非自动更新的结果集?

ios - 向下滑动 ScrollView 以关闭 View Controller

ios - 在 Swift 中将 [NSObject, AnyObject] 转换为 [String, AnyObject]

iphone - NSNumberFormatter numberFromString 返回 null

iphone - 在 plist 中处理持久 boolean 值的最佳方法?

objective-c - 您需要实现什么来为 NSArrayController 提供内容集?

ios - 检查 CLPlacemark 的名称是否为街道地址

Iphone sdk - 比较 NSNumber 时的奇怪行为

iphone - 使用 NSPredicates/KVC 获取兄弟键数组