web-dev-qa-db-de.com

Konvertierung von Dezimal nach Doppel in Swift 3

Ich migriere ein Projekt von Swift 2.2 nach Swift 3 und versuche, alte Cocoa-Datentypen nach Möglichkeit zu beseitigen.

Mein Problem ist hier: Migration von NSDecimalNumber nach Decimal.

Ich habe NSDecimalNumber mit Double in Swift 2.2 überbrückt:

let double = 3.14
let decimalNumber = NSDecimalNumber(value: double)

let doubleFromDecimal = decimalNumber.doubleValue

Wechseln Sie jetzt zu Swift 3 :

let double = 3.14
let decimal = Decimal(double)

let doubleFromDecimal = ???

decimal.doubleValue ist nicht vorhanden, noch Double(decimal), nicht einmal decimal as Double____. Der einzige Hacker, den ich auftreibe, ist: 

let doubleFromDecimal = (decimal as NSDecimalNumber).doubleValue

Aber das wäre völlig dumm zu versuchen, NSDecimalNumber loszuwerden und es ab und zu benutzen zu müssen ...

Nun, entweder habe ich etwas offensichtliches übersehen, und ich bitte um Verzeihung dafür, dass Sie Ihre Zeit verschwenden, oder es gibt meiner Meinung nach ein Schlupfloch, das angegangen werden muss.

Vielen Dank im Voraus für Ihre Hilfe.

Bearbeiten : Zum Thema Swift 4 gibt es keine weiteren Informationen.

24
Zaphod

Eine andere Lösung, die in Swift 3 funktioniert, besteht darin, Decimal in NSNumber umzuwandeln und daraus Double zu erstellen.

let someDouble = Double(someDecimal as NSNumber)
10
rmaddy

NSDecimalNumber und Decimal sind überbrückt

Die Swift-Überlagerung des Foundation-Frameworks liefert die Dezimalzahl Struktur, die zur NSDecimalNumber-Klasse überbrückt. Die Dezimalzahl Der Werttyp bietet dieselbe Funktionalität wie die NSDecimalNumber Referenztyp, und die beiden können im Swift-Code austauschbar verwendet werden die mit Objective-C-APIs interagiert. Dieses Verhalten ist ähnlich wie Überbrückt standardmäßige String-, numerische und Auflistungstypen mit ihrer entsprechende Foundation-Klassen. Apple Docs

wie bei einigen anderen überbrückten Typen fehlen jedoch bestimmte Elemente.

Um die Funktionalität wiederherzustellen, können Sie eine Erweiterung schreiben:

extension Decimal {
    var doubleValue:Double {
        return NSDecimalNumber(decimal:self).doubleValue
    }
}

// implementation
let d = Decimal(floatLiteral: 10.65)
d.doubleValue
6
sketchyTech

Decimal in Swift 3 ist nicht NSDecimalNumber . Es ist NSDecimal , ein völlig anderer Typ.

Sie sollten NSDecimalNumber einfach so weitermachen wie bisher.

3
user28434

Lösung, die in Swift 4 funktioniert

let double = 3.14
let decimal = Decimal(double)
let doubleFromDecimal = NSDecimalNumber(decimal: decimal).doubleValue
print(doubleFromDecimal)

Editieren: Ohne NSDecimalNumber/NSNumber

let double = 3.14
let decimal = Decimal(double)
if let doubleFromDecimal = Double(decimal.description){
    print(doubleFromDecimal)
}
2
Pranavan Sp

Swift 5

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

Sie sollten den Operator as verwenden, um einen Swift-Typ in seinen überbrückten unterliegenden Objective-C-Typ umzuwandeln. Verwenden Sie einfach as wie folgt.

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

In Swift 4 ist DecimalNSDecimalNumber. Hier ein Zitat aus der offiziellen Dokumentation von Apple in Xcode 10.

Wichtig

Die Swift-Überlagerung des Foundation-Frameworks bietet die Decimal Struktur, die zur NSDecimalNumber-Klasse führt. Für mehr Informationen zu Werttypen finden Sie unter Arbeiten mit Cocoa Frameworks in Verwendung von Swift mit Cocoa und Objective-C (Swift 4.1).

Es gibt kein NSDecimal mehr . Es gab verwirrenden NSDecimal-Typ in Swift 3, aber es scheint ein Fehler zu sein . Keine Verwirrung mehr.

Hinweis

Ich sehe, dass das OP kein Interesse an Swift 4 hat, aber ich habe diese Antwort hinzugefügt, weil die Erwähnung nur von (veraltetem) Swift 3 mich verwirrt hat.

0
Eonil