プロジェクトをSwift 2.2からSwiftに移行しており、可能な場合は古いCocoaデータ型を削除しようとしています。
私の問題はここにあります:NSDecimalNumber
からDecimal
への移行。
Swift 2.2で両方の方法でNSDecimalNumber
をDouble
にブリッジしていました
_let double = 3.14
let decimalNumber = NSDecimalNumber(value: double)
let doubleFromDecimal = decimalNumber.doubleValue
_
次に、Swiftに切り替えます。
_let double = 3.14
let decimal = Decimal(double)
let doubleFromDecimal = ???
_
_decimal.doubleValue
_は存在せず、Double(decimal)
も、_decimal as Double
_でもありません...私が思いつく唯一のハックは:
_let doubleFromDecimal = (decimal as NSDecimalNumber).doubleValue
_
しかし、それはNSDecimalNumber
を取り除こうとするのは完全に愚かであり、たまに使用しなければなりません...
まあ、私は明らかなものを見逃したか、あなたの時間を無駄にしたことをお許しください、または私の意見では、対処する必要がある抜け穴があります...
よろしくお願いします。
編集:Swift 4の件名はこれ以上ありません。
編集:Swift 5の件名はこれ以上ありません。
Swift 3で動作する別の解決策は、Decimal
をNSNumber
にキャストし、そこからDouble
を作成することです。
let someDouble = Double(someDecimal as NSNumber)
NSDecimalNumber
とDecimal
はブリッジされます
FoundationフレームワークへのSwiftオーバーレイは、NSDecimalNumberクラスにブリッジするDecimal構造を提供します。Decimal値型は、NSDecimalNumber参照型と同じ機能を提供します。 Swift Objective-C APIと対話するコード。この動作は、Swift標準文字列、数値、およびコレクションタイプを対応するFoundationクラスにブリッジする方法に似ています。 Apple Docs
ただし、他のブリッジタイプと同様に、特定の要素が欠落しています。
機能を回復するには、拡張機能を作成できます。
extension Decimal {
var doubleValue:Double {
return NSDecimalNumber(decimal:self).doubleValue
}
}
// implementation
let d = Decimal(floatLiteral: 10.65)
d.doubleValue
Swift 4で機能するソリューション
let double = 3.14
let decimal = Decimal(double)
let doubleFromDecimal = NSDecimalNumber(decimal: decimal).doubleValue
print(doubleFromDecimal)
編集:なしNSDecimalNumber
/NSNumber
let double = 3.14
let decimal = Decimal(double)
if let doubleFromDecimal = Double(decimal.description){
print(doubleFromDecimal)
}
Decimal
in Swift 3は NSDecimalNumber
ではありません。 NSDecimal
、完全に異なるタイプ。
以前と同じようにNSDecimalNumber
を使用し続ける必要があります。
as
演算子を使用してSwiftタイプをそのbridged基になるObjective- Cタイプなので、このようにas
を使用します。
let p = Decimal(1)
let q = (p as NSDecimalNumber).doubleValue
In Swift 4、4、Decimal
isNSDecimalNumber
。Appleの公式からの引用です。 Xcode 10のドキュメント。
重要
FoundationフレームワークへのSwiftオーバーレイ)は、
Decimal
クラスにブリッジするNSDecimalNumber
構造を提供します。値型の詳細については、「Cocoaフレームワークの操作」を参照してください「Swift CocoaおよびObjective-C(Swift 4.1)での使用」を参照してください。
NSDecimal
はもうありません。 Swift 3でNSDecimal
タイプが混乱していましたが、それはバグのようです。これ以上混乱はありません。
OPはSwift 4に興味がないが、(旧式の)Swift 3について混乱させられたため、この答えを追加した。
let doubleValue = Double(truncating: decimalValue as NSNumber)