这不起作用(当然)没有打印,Xcode 发出关于 Cast 总是失败的警告:
let bool = true
if let range = bool as? NSRange {
print(range)
}
为什么会这样?我认为它不应该:
let bool: AnyObject = true
if let range = bool as? NSRange {
print(range)
}
这实际上会打印出 (0,0)
... 如果它是 false
,这可能有点道理,但它是 true
所以,是的......对我来说没有意义。
Swift 1.2 或 2.0 中的行为相同。但这让我有点怀疑 Swift 的类型系统。
最佳答案
与其说这是 Swift 类型系统的错误,不如说这是 Objective-C 互操作性的副作用。
let bool: AnyObject = true
实际上是 let bool = NSNumber(bool: true)
。这不再是 Swift Bool,而是一个 Obj-C (Foundation) NSNumber 对象。
然后,让 range = bool as? NSRange
尝试将您的值转换为 NSRange。 NSNumber 是 NSValue 的子类,所以这类似于
let range = NSNumber(bool: true).rangeValue
返回 {0,0}。这就是 NSValue 的工作原理。这是 Hopper 的一些反汇编:
从 Swift 团队的角度来看,如果他们在进行转换之前更加小心地检查类型,这可能是可以解决的。你应该考虑 filing a bug .
关于快速将 bool 转换为 NSRange,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32642203/