web-dev-qa-db-ja.com

Swift 3での10進数から二重変換への変換

プロジェクトをSwift 2.2からSwiftに移行しており、可能な場合は古いCocoaデータ型を削除しようとしています。

私の問題はここにあります:NSDecimalNumberからDecimalへの移行。

Swift 2.2で両方の方法でNSDecimalNumberDoubleにブリッジしていました

_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の件名はこれ以上ありません。

27
Zaphod

Swift 3で動作する別の解決策は、DecimalNSNumberにキャストし、そこからDoubleを作成することです。

let someDouble = Double(someDecimal as NSNumber)
13
rmaddy

NSDecimalNumberDecimalはブリッジされます

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
9
sketchyTech

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)
}
5
Pranavan Sp

Decimal in Swift 3は NSDecimalNumber ではありません。 NSDecimal 、完全に異なるタイプ。

以前と同じようにNSDecimalNumberを使用し続ける必要があります。

3
user28434

as演算子を使用してSwiftタイプをそのbridged基になるObjective- Cタイプなので、このようにasを使用します。

let p = Decimal(1)
let q = (p as NSDecimalNumber).doubleValue

In Swift 4、4、DecimalisNSDecimalNumber。Appleの公式からの引用です。 Xcode 10のドキュメント。

重要

FoundationフレームワークへのSwiftオーバーレイ)は、DecimalクラスにブリッジするNSDecimalNumber構造を提供します。値型の詳細については、「Cocoaフレームワークの操作」を参照してください「Swift CocoaおよびObjective-C(Swift 4.1)での使用」を参照してください。

NSDecimalはもうありません。 Swift 3でNSDecimalタイプが混乱していましたが、それはバグのようです。これ以上混乱はありません。

注意

OPはSwift 4に興味がないが、(旧式の)Swift 3について混乱させられたため、この答えを追加した。

2
Eonil

スイフト5

let doubleValue = Double(truncating: decimalValue as NSNumber)
0
RaffAl