Swift 3中的十进制到双精度转换
我正在将一个项目从Swift 2.2迁移到Swift 3 ,而且我试图摆脱旧的Cocoa数据types。
我的问题是在这里:将NSDecimalNumber
迁移到Decimal
。
我曾经桥接NSDecimalNumber
在Swift 2.2中 Double
:
let double = 3.14 let decimalNumber = NSDecimalNumber(value: double) let doubleFromDecimal = decimalNumber.doubleValue
现在,切换到Swift 3 :
let double = 3.14 let decimal = Decimal(double) let doubleFromDecimal = ???
decimal.doubleValue
不存在,也不是Double(decimal)
,甚至没有Double(decimal)
decimal.doubleValue
decimal as Double
…唯一的黑客我想出来的是:
let doubleFromDecimal = (decimal as NSDecimalNumber).doubleValue
但是,这将是完全愚蠢的尝试摆脱NSDecimalNumber
,并不得不在一段时间内使用它…
那么,要么我错过了一些明显的东西,请原谅你浪费时间,或者我认为还有一个需要解决的漏洞。
在此先感谢您的帮助。
编辑 :没有更多关于Swift 4的主题。
Swift 3中的Decimal
不是NSDecimalNumber
。 这是NSDecimal
,完全不同的types。
你应该像以前一样继续使用NSDecimalNumber
。
NSDecimalNumber
和Decimal
被桥接
Swift覆盖到Foundation框架提供了Decimal结构,它桥接到NSDecimalNumber类。 十进制值types提供了与NSDecimalNumber引用types相同的function,两者可以在与Objective-C API交互的Swift代码中互换使用。 这种行为类似于Swift将标准string,数字和集合types桥接到其相应的Foundation类。 苹果文件
但与其他一些桥接types一样,缺less某些元素。
要重新获得function,你可以写一个扩展名:
extension Decimal { var doubleValue:Double { return NSDecimalNumber(decimal:self).doubleValue } } // implementation let d = Decimal(floatLiteral: 10.65) d.doubleValue
在Swift 3中工作的另一个解决scheme是将Decimal
为NSNumber
并从中创buildDouble
。
let someDouble = Double(someDecimal as NSNumber)