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.
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)
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
Decimal
in Swift 3 ist nicht NSDecimalNumber
. Es ist NSDecimal
, ein völlig anderer Typ.
Sie sollten NSDecimalNumber
einfach so weitermachen wie bisher.
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)
}
let doubleValue = Double(truncating: decimalValue as NSNumber)
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 Decimal
NSDecimalNumber
. Hier ein Zitat aus der offiziellen Dokumentation von Apple in Xcode 10.
Wichtig
Die Swift-Überlagerung des Foundation-Frameworks bietet die
Decimal
Struktur, die zurNSDecimalNumber
-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.
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.