升级到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)
Run Code Online (Sandbox Code Playgroud)
这里,第一次演员失败,即x == nil.第二个演员成功,并且init:truncating构造函数的Float实例化也成功,即z == 1.12.n对双人的演员成功了,对我来说,完全没有意义.
任何人都可以向我解释这种行为吗?也许任何人都可以给我一个很好的理由为什么n浮动失败?这是一个错误吗?如果这是预期的行为,您能否参考描述这个的Swift文档中的位置?
Mar*_*n R 11
这是SE-0170 NSNumber桥接和数字类型的结果,在Swift 4中实现:
as?forNSNumber应该表示"我可以安全地将存储在这个名为NSNumber的不透明框中的值表示为我想要的值吗?".
1.12是一个浮点字面值,并推断为a Double,因此NSNumber(value: 1.12)是"装箱"最接近的64位浮点值1.12.将其转换为32位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
Run Code Online (Sandbox Code Playgroud)
另一方面,1.0可以完全表示为Float:
let m = NSNumber(value: 1.0)
let y = m.floatValue
let mm = NSNumber(value: y)
print(m == mm) // true
Run Code Online (Sandbox Code Playgroud)
这就是为什么铸造m as? Float成功的原因.都
n.floatValue
Float(truncating: n)
Run Code Online (Sandbox Code Playgroud)
可用于将数字"截断"为最接近的可表示的32位浮点值.
| 归档时间: |
|
| 查看次数: |
633 次 |
| 最近记录: |