2016-04-27 3 views
0

I-Daten herunterlade und Umgang mit dem folgenden Code in den viewDidLoad() mit:Swift/NSURLSession JSON download/unerwartet null gefunden, während ein optionalen Wert Abwickeln

NSURLSession.sharedSession().dataTaskWithURL(NSURL(string: "http://api.fixer.io/latest?base=USD")!, completionHandler: { (data, response, error) -> Void in 

     // Check if data was received successfully 
     if error == nil && data != nil { 
      do { 
      // Convert NSData to Dictionary where keys are of type String, and values are of any type 
      let json = try NSJSONSerialization.JSONObjectWithData(data!, options: NSJSONReadingOptions.MutableContainers) as! [String:AnyObject] 
      // Access specific key with value of type String 
      let dollarToDollarDict = json["rates"] as! NSDictionary 
      SpeedLog.print(dollarToDollarDict) 
      let dollarToDollarNSNumber = dollarToDollarDict.valueForKey("EUR") 
      let dollarToDollarString = String(dollarToDollarNSNumber) 
      SpeedLog.print(dollarToDollarString) 
      self.dollarExchangeRateStr = dollarToDollarString 
      } catch { 
       // Something went wrong 
      } 
      } 
     }).resume() 

print(dollarToDollarDict) druckt die richtige Wörterbuch. print(dollarToDollarString) druckt den richtigen gewünschten String ich haben will als: „Optional (1,1303)“

Aber wenn ich will den String in dollarToDollarString verwenden, indem eine Taste gedrückt hat, mit:

func dollarBtnFunc(button: UIButton!) { 

    if dollarExchangeRateStr != "" { 
     SpeedLog.print("DOLLAR downloaded", dollarExchangeRateStr)    
     let dollarExchangeRateDouble = Double(dollarExchangeRateStr)! 
     tableCounterData = ["\(numberInt) $", "\(numberInt * dollarExchangeRateDouble) €"] 

    } else if dollarExchangeRateStr == "" { 
     SpeedLog.print("DOLLAR not downloaded, Dollar = 0.89") 
     tableCounterData = ["\(numberInt) $", "\(numberInt * 0.89) €"] 
    } 
    currentButton = "dollarBtnFunc" 
} 

ich unexpectedly found nil while unwrapping an Optional value auf let dollarExchangeRateDouble = Double(dollarExchangeRateStr)!.

Was fehlt mir? Warum ist der String nil? Ich habe den korrekten Wert früher gedruckt ... Warum ist es nicht mehr Teil meines Strings, wenn ich es später benutzen möchte? Hilfe wird sehr geschätzt.

+0

es ist ein Druck-Erweiterung. ist das selbe wie 'print()' –

+0

Also, was macht SpeedLog.print ("DOLLAR heruntergeladen", dollarExchangeRateStr) genau aus? –

+0

'dollarBtnFunc [405]: DOLLAR heruntergeladen Optional (0.88472)' –

Antwort

1

Ihr Problem ist in diesen 2 Zeilen:

let dollarToDollarNSNumber = dollarToDollarDict.valueForKey("EUR") 
let dollarToDollarString = String(dollarToDollarNSNumber) 

dollarToDollarDict.valueForKey("EUR") eine optionale zurückgibt, so dollarToDollarNSNumber ein optional.

Aufruf des String initializer mit einem optionalen gibt die Zeichenfolge "Optional(...)" so, wenn Sie später die Zeichenfolge an den initializer Double geben es nicht, weil es Buchstaben in ihm hat.

Sie müssen den Wert, den Sie von valueForKey erhalten auszupacken durch so etwas wie dies zu tun:

if let dollarToDollarNSNumber = dollarToDollarDict.valueForKey("EUR") { 
    let dollarToDollarString = String(dollarToDollarNSNumber) 
    SpeedLog.print(dollarToDollarString) 
    self.dollarExchangeRateStr = dollarToDollarString 
} else { 
    self.dollarExchangeRateStr = "" 
} 
+0

DANKE! nicht nur, dass du es getan hast. Du hast es erklärt, also habe ich es verstanden ... vielen Dank! –

1

Ich glaube, Ihr Problem liegt in der Umwandlung von dollarExchangeRateStr zu Double. Double ("foo") gibt ein optionales Attribut zurück, bei dem die Konvertierung wahrscheinlich fehlschlägt, so dass es null ist, was beim Auspacken fehlschlägt.

ändern

func dollarBtnFunc(button: UIButton!) { 

    if let exchangeRateStr = dollarExchangeRateStr { 
     SpeedLog.print("DOLLAR downloaded", exchangeRateStr)    
     let dollarExchangeRateDouble = Double(exchangeRateStr) { 
     tableCounterData = ["\(numberInt) $", "\(numberInt * dollarExchangeRateDouble) €"] 
     } 
     else { 
     print("your string to double conversion failed") 
     } 
    } else if dollarExchangeRateStr == "" { 
     SpeedLog.print("DOLLAR not downloaded, Dollar = 0.89") 
     tableCounterData = ["\(numberInt) $", "\(numberInt * 0.89) €"] 
    } 
    currentButton = "dollarBtnFunc" 
} 

es aus Ihrer Kommentare sieht, dass dollarExchangeRateStr auch ein optional ist, was bedeutet, dass Sie das auch müssen auszupacken, die beachten, wenn exchangeRateStr = dollarExchangeRateStr

Prost lassen!

+0

Vielen Dank für Ihre Mühe –

+0

Happy to help !! –

Verwandte Themen