Swift将bool转换为NSRange

时间:2015-09-18 00:51:34

标签: swift casting

这不起作用(当然)没有任何打印,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的类型系统产生了一些怀疑。

1 个答案:

答案 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的一些反汇编:

disassembly

从Swift团队的角度来看,这可能是可以解决的,如果他们在进行转换之前更加谨慎地检查类型。您应该考虑filing a bug