Conversion décimale à Double dans Swift 3
je suis en train de migrer un projet de Swift 2.2 Swift 3, et je vais essayer de vous débarrasser de vieux Cacao types de données lorsque cela est possible.
Mon problème est ici: migration NSDecimalNumber
Decimal
.
j'ai utilisé à pont NSDecimalNumber
Double
les deux façons Swift 2.2:
let double = 3.14
let decimalNumber = NSDecimalNumber(value: double)
let doubleFromDecimal = decimalNumber.doubleValue
maintenant, passez à Swift 3:
let double = 3.14
let decimal = Decimal(double)
let doubleFromDecimal = ???
decimal.doubleValue
n'existe pas, ni Double(decimal)
, pas même decimal as Double
...
Le seul hack me vient est:
let doubleFromDecimal = (decimal as NSDecimalNumber).doubleValue
mais ce serait complètement stupide d'essayer de se débarrasser de NSDecimalNumber
, et avoir à l'utiliser de temps en temps...
Eh bien, soit j'ai manqué quelque chose d'évident, et je vous demande pardon de vous avoir fait perdre votre temps, soit il y a une faille à combler, à mon avis...
Merci d'avance pour votre aide.
Modifier : Rien de plus sur le sujet sur Swift 4.
5 réponses
une autre solution qui fonctionne dans Swift 3 est de lancer le Decimal
NSNumber
et créer le Double
depuis que.
let someDouble = Double(someDecimal as NSNumber)
NSDecimalNumber
et Decimal
sont pontés
la superposition Swift au cadre de base fournit la décimale structure, qui fait le lien avec la classe NSDecimalNumber. décimal le type de valeur offre les mêmes fonctionnalités que le NSDecimalNumber type de référence, et les deux peuvent être utilisés de manière interchangeable dans le code Swift ça interagit avec les APIs Objective-C. Ce comportement est similaire à comment Swift ponts de cordes standard, numérique, et les types de collection à leur classes de base correspondantes. Apple Docs
mais comme pour d'autres types pontés, certains éléments sont absents.
Pour retrouver la fonctionnalité que vous pouvez écrire une extension:
extension Decimal {
var doubleValue:Double {
return NSDecimalNumber(decimal:self).doubleValue
}
}
// implementation
let d = Decimal(floatLiteral: 10.65)
d.doubleValue
Decimal
dans Swift 3 n'est pas NSDecimalNumber
. NSDecimal
, de type complètement différent.
Vous devez juste maintenir à l'aide de NSDecimalNumber
comme vous l'avez fait avant.
Solution qui fonctionne dans Swift 4
let double = 3.14
let decimal = Decimal(double)
let doubleFromDecimal = NSDecimalNumber(decimal: decimal).doubleValue
print(doubleFromDecimal)
Edit: Sans NSDecimalNumber
/NSNumber
let double = 3.14
let decimal = Decimal(double)
if let doubleFromDecimal = Double(decimal.description){
print(doubleFromDecimal)
}
Vous êtes censé utiliser as
opérateur pour lancer un type Swift à son comblé Type Objectif-C sous-jacent. Juste utiliser as
comme ceci.
let p = Decimal(1)
let q = (p as NSDecimalNumber).doubleValue
Dans Swift 4,Decimal
NSDecimalNumber
. Voici la citation de la documentation officielle D'Apple dans Xcode 10.
Important
la superposition Swift au cadre de fondation fournit le
Decimal
la structure, qui des ponts vers l'NSDecimalNumber
classe. Pour plus d' informations sur les types de valeur, voir travailler avec les cadres de cacao dans Utilisation de Swift avec Cocoa et Objective-C (Swift 4.1).
Il n'y a pas de NSDecimal
plus maintenant.
Il y a confusion NSDecimal
tapez Swift 3, mais ça semble être un bug.
Plus de risque de confusion.
Remarque:
je vois que L'OP N'est pas intéressé par Swift 4, mais j'ai ajouté cette réponse parce que mentionner seulement sur (dépassé) Swift 3 m'a rendu confus.