这不起作用(当然)没有任何打印,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
所以,是的...没有#&# 39;对我有意义。
Swift 1.2或2.0中的相同行为。但它让我对Swift的类型系统产生了一些怀疑。
答案 0 :(得分:1)
这不是Swift类型系统的错误,因为它是Objective-C互操作性的副作用。
let bool: AnyObject = true
实际上是let bool = NSNumber(bool: true)
。这不再是Swift Bool,而是Obj-C(Foundation)NSNumber对象。
然后,let range = bool as? NSRange
尝试将您的值转换为NSRange。 NSNumber是NSValue的子类,因此类似于
let range = NSNumber(bool: true).rangeValue
返回{0,0}。这就是NSValue的工作原理。这是Hopper的一些反汇编:
从Swift团队的角度来看,这可能是可以解决的,如果他们在进行转换之前更加谨慎地检查类型。您应该考虑filing a bug。