wake-up-neo.net

Konvertieren Sie die optionale Zeichenfolge in Swift 3


Ich habe eine Optionszeichenfolge und möchte diese in double umwandeln.
Dies funktionierte in Swift 2, aber seit ich in Swift 3 konvertiert bin, bekomme ich den Wert 0.

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

Ich habe check und width hat einen optionalen String-Wert von -80,234543218675654, aber der dLati-Wert ist 0

*************** ok, neues Update zur Klarheit *****************
Ich habe einen Viewcontroller, in dem ich einen Button habe, und wenn der Button berührt wird, ruft er einen anderen Viewcontroller auf und übergibt ein paar Werte an ihn

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
    }
}

Hier ist der Code für den zweiten View-Controller namens 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
       }
       .
       .
   }

Danke Borna

13
borna

Ein sicherer Weg, dies zu erreichen, ohne Foundation-Typen verwenden zu müssen, ist der Initialisierer von Double:

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

Entpacken Sie den Wert latitude sicher und verwenden Sie dann

var dLati = 0.0

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

Dieser Code funktioniert gut.

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

Wenn Sie eine Zeichenfolge mit einem doppelten Wert erhalten, so etwas 

"Optional(12.34567)"

Sie können eine Regex verwenden, die den doppelten Wert aus der Zeichenfolge ..__ entnimmt Dies ist der Beispielcode für eine Regex, wenn die Zeichenfolge "Optional(12.34567)" lautet

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

Sie können dies einfach in einer Zeile tun.

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

Dadurch wird eine Variable mit dem Namen "width" vom Typ Double erstellt, die entweder mit einem erfolgreichen Double aus String instanziiert wird oder einen Fallbackwert von 0,0 erhält

1
achi

Konvertieren Sie es nicht in eine NSString, Sie können es zu einer Double forcieren, haben aber einen Fallback, wenn es fehlschlägt. Etwas wie das:

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

Also in deinem Fall:

dLati = Double(latitude!) ?? 0.0

Update: Um nil-Werte zu behandeln, gehen Sie folgendermaßen vor (beachten Sie, dass cLat nil ist:

// 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

In Swift 3.1 können wir Erweiterungen und Concrete Constrained Extensions kombinieren

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

Oder

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

Tatsächlich war das optionale Word Teil der Zeichenfolge. Nicht sicher, wie es in der Zeichenfolge hinzugefügt wurde? Aber so wie ich es korrigiert hatte, war es so. Breitengrad war diese Zeichenfolge "Optional (26.33691567239162)", dann habe ich diesen Code eingegeben

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) 

und bekam dies als Endwert
26.33691567239162

0
borna