Max*_*eod 25 key-value-coding nsnumber swift nskeyvaluecoding
我setValue(value, forKey: key)
在我的NSKeyValueCoding兼容的Swift NSObject子类中成功使用了该方法.
这在String选项上非常有效,例如
var name:String?
Run Code Online (Sandbox Code Playgroud)
但是,在Int选项上,它会失败,触发我为了调试目的而重写的未定义键方法:
override func setValue(value: AnyObject!, forUndefinedKey key: String!) {
println("\(self) this class is not key value coding-compliant for the key \(key)")
}
Run Code Online (Sandbox Code Playgroud)
因此,例如,myId
具有良好整数值的键将触发上面的未定义键方法.
var myId:Int?
Run Code Online (Sandbox Code Playgroud)
如果我将上面的定义更改为非可选,那么一切正常:
var myId:Int = 0
Run Code Online (Sandbox Code Playgroud)
随着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)
Run Code Online (Sandbox Code Playgroud)
所以,问题是,有没有人在Swift中使用过 - setValue(value, forKey: key)
Int类型的NSKeyValueCoding方法成功了吗?
Cod*_*aFi 24
KVO无法使用纯Swift选项,因为纯Swift选项不是Objective-C对象.Swift禁止使用dynamic
或@objc
使用泛型类和结构,因为没有有效的Objective-C等价物,因此运行时未设置为在这些类型的对象的实例上支持KVO.至于它的工作原理String?
,这种类型是免费桥接的NSString
,所以它在语义上等同于NSString *
一个Objective-C类型,运行时知道如何处理.但是将它与Int?
语义等价物进行比较Optional<Int>
,不是UnsafePointer<Int>
或者NSNumber *
你想要的那样.现在,你需要说服类型检查器,使用它在Objective-C中表示是安全的NSNumber!
.
这完全是倒退的,在我看来,这是类型系统的一个不幸的限制.对于遇到过这篇文章的工程师,请参阅rdar:// 18624182.
归档时间: |
|
查看次数: |
5946 次 |
最近记录: |