Swift 3中的十进制到双精度转换

我正在将一个项目从Swift 2.2迁移到Swift 3 ,而且我试图摆脱旧的Cocoa数据types。

我的问题是在这里:将NSDecimalNumber迁移到Decimal

我曾经桥接NSDecimalNumberSwift 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

NSDecimalNumberDecimal被桥接

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是将DecimalNSNumber并从中创buildDouble

 let someDouble = Double(someDecimal as NSNumber)