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 NSDecimalNumberDecimal.

j'ai utilisé à pont NSDecimalNumberDouble 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.

22
demandé sur Zaphod 2016-10-06 11:08:48

5 réponses

une autre solution qui fonctionne dans Swift 3 est de lancer le DecimalNSNumber et créer le Double depuis que.

let someDouble = Double(someDecimal as NSNumber)
9
répondu rmaddy 2017-08-23 16:27:11

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
4
répondu sketchyTech 2016-10-06 09:02:03

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.

3
répondu user28434 2016-10-06 08:16:17

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)
}
1
répondu Pranavan Sp 2018-07-20 10:07:36

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,DecimalNSDecimalNumber. 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.

0
répondu Eonil 2018-09-28 16:53:06