将NSNumber强制转换为Float

时间:2018-04-06 08:53:22

标签: ios swift swift4

升级到Xcode 9.3(9E145)后,我的应用程序出现了一些意想不到的行为。似乎问题是将一个NSNumber转换为Float。我使用as类型强制转换运算符。请参阅以下示例。

let n = NSNumber.init(value: 1.12)
let m = NSNumber.init(value: 1.00)

let x = n as? Float
let y = m as? Float

let xd = n as? Double

let z = Float(truncating: n)

此处,第一次演员失败,即x == nil。第二次转换成功,并且使用init:truncating构造函数的Float实例化也成功,即z == 1.12。 n对双击的成功,对我来说,根本就没有意义。

任何人都可以向我解释这种行为吗?即任何人都可以给我一个很好的理由为什么对浮动的n投射失败?这是一个错误吗?如果这是预期的行为,您能否参考描述这个的Swift文档中的位置?

1 个答案:

答案 0 :(得分:10)

这是SE-0170 NSNumber bridging and Numeric types的结果,在Swift 4中实现:

  as?的{​​{1}}应该表示"我可以安全地将存储在这个名为NSNumber的不透明框中的值表示为我想要的值吗?"。

NSNumber是浮点字面值,推断为1.12,因此Double是“装箱”64位浮点值 最接近NSNumber(value: 1.12)。将其转换为32位1.12不会 保留这个值:

Float

另一方面,let n = NSNumber(value: 1.12) let x = Float(truncating: n) // Or: let x = n.floatValue let nn = NSNumber(value: x) print(n == nn) // false 可以完全表示为1.0

Float

这就是为什么施放let m = NSNumber(value: 1.0) let y = m.floatValue let mm = NSNumber(value: y) print(m == mm) // true 成功的原因。两个

m as? Float

可用于将数字“截断”为最接近的可表示 32位浮点值。