web-dev-qa-db-fra.com

Convertit la chaîne facultative en double dans Swift 3


J'ai une chaîne d'option et je veux la convertir en double.
Cela a fonctionné dans Swift 2, mais depuis que je suis converti en Swift 3, la valeur de 0 s’élève à 0.

var dLati = 0.0
dLati = (latitude as NSString).doubleValue

J'ai check et latitude a une valeur de chaîne optionnelle de quelque chose comme -80.234543218675654, mais la valeur dLati est 0

*************** ok, nouvelle mise à jour pour plus de clarté *****************
J'ai un contrôleur de vue pour lequel j'ai un bouton, et lorsque le bouton est touché, il appelle un autre contrôleur de vue et lui transmet quelques valeurs il y a le code pour le premier contrôleur de vue

var currentLatitude: String? = ""
var currentLongitude: String? = ""
var deviceName = ""
var address = ""
// somewhere in the code, currentLatitude and currentLongitude are get set  
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "map" {
       let destViewController : MapViewController = segue.destination as! MapViewController
       print(currentLongitude!)  // Print display: Optional(-80.192279355363768)
       print(currentLatitude!) // Print display: Optional(25.55692663937162) 
       destViewController.longitude = currentLongitude!
       destViewController.latitude = currentLatitude!
       destViewController.deviceName = deviceName
       destViewController.address = address
    }
}

Voici le code du second contrôleur de vue appelé MapViewController

   var longitude: String? = " "
   var latitude: String? = ""
   .
   .
   override func viewDidLoad() {
       if let lat = latitude {
          print(lat) // Print display: optiona(25.55692663937162)
          dLati = (lat as NSString).doubleValue
          print(dLati)  // Print display: 0.0
       }
       .
       .
   }

Merci Borna

13
borna

Un moyen sûr d'y parvenir sans avoir à utiliser les types Foundation consiste à utiliser l'initialiseur de Double:

if let lat = latitude, let doubleLat = Double(lat) {
  print(doubleLat)  // doubleLat is of type Double now
}
23
BJ Miller

Décompressez la valeur latitude en toute sécurité, puis utilisez

var dLati = 0.0

if let lat = latitude {
    dLati = (lat as NSString).doubleValue
}
6
Rajan Maheshwari
let dLati = Double(latitude ?? "") ?? 0.0
5
user3441734

Ce code fonctionne bien.

var dLati = 0.0
let latitude: String? = "-80.234543218675654"
if let strLat = latitude {
    dLati = Double(strLat)!
}
3
MjZac

Lorsque vous obtenez une chaîne à double valeur, quelque chose comme ceci 

"Optional(12.34567)"

Vous pouvez utiliser une expression régulière qui extrait la valeur double de la chaîne . Il s'agit de l'exemple de code pour une expression régulière si la chaîne est "Optional(12.34567)":

let doubleLatitude = location.latitude?.replacingOccurrences(of: "[^\\.\\d+]", with: "", options: [.regularExpression])
1
sumit meena

Vous pouvez le faire simplement en une seule ligne.

var latitude: Double = Double("-80.234543218675654") ?? 0.0

Cela crée une variable nommée latitude de type Double qui est soit instanciée avec un double réussi de chaîne, soit reçoit une valeur de repli de 0.0

1
achi

Ne le convertissez pas en un NSString, vous pouvez le forcer pour un Double mais avoir un repli en cas d'échec. Quelque chose comme ça:

let aLat: String? = "11.123456"
let bLat: String? = "11"
let cLat: String? = nil

let a = Double(aLat!) ?? 0.0 // 11.123456
let b = Double(bLat!) ?? 0.0 // 11
let c = Double(cLat!) ?? 0.0 // 0

Donc dans votre cas:

dLati = Double(latitude!) ?? 0.0

Mise à jour: Pour gérer les valeurs nil, procédez comme suit (notez que cLat est nil:

// Will succeed
if let a = aLat, let aD = Double(aLat!) {
    print(aD)
}
else {
    print("failed")
}

// Will succeed
if let b = bLat, let bD = Double(bLat!) {
    print(bD)
}
else {
    print("failed")
}

// Will fail
if let c = cLat, let cD = Double(cLat!) {
    print(cD)
}
else {
    print("failed")
}
0
Rashwan L

Dans Swift 3.1 , nous pouvons combiner des extensions et des extensions en béton contraint.

extension Optional where Wrapped == String
{
    var asDouble: Double
    {
        return NSString(string: self ?? "").doubleValue
    }
}

Ou

extension Optional where Wrapped == String
{
        var asDouble: Double
        {
            return Double(str ?? "0.00") ?? 0.0
        }
}
0
Karthik

En fait, le mot facultatif faisait partie de la chaîne. Vous ne savez pas comment cela a été ajouté dans la chaîne? Mais la façon dont j'ai résolu le problème était comme ça. latitude était cette chaîne "Optionnel (26.33691567239162)" alors j'ai fait ce code

let start = latitude.index(latitude.startIndex, offsetBy: 9) 
let end = latitude.index(latitude.endIndex, offsetBy: -1) 
let range = start..<end 
latitude = latitude.substring(with: range) 

et a cela comme valeur finale
26.33691567239162

0
borna