快速将 bool 转换为 NSRange

标签 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 所以,是的......对我来说没有意义。

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

disassembly

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

关于快速将 bool 转换为 NSRange,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32642203/

相关文章:

ios - 将数据从多个 VC 传递到 Swift 中的最后一个

ios - 无法将 NSAttributedString.DocumentAttributeKey 类型的值转换为 .DocumentReadingOptionKey

ios - iOS 界面生成器的等高约束问题

c - 将无符号字符转换为有符号数据类型时,为什么在汇编中使用 movzbl?

c++ - 无法将数组转换为指针

java - 在 Java 中显式从 char 转换为 int 的原因是什么?

ios - UIAlertController 阻止 segue 执行 ("window is not equal to view’ s 窗口“)

ios - 如何在 switch case(swift)中创建循环?

c++ - 如何消除构造函数选择的强制转换

Java - 从 Int 到 Short 的显式转换