2016-04-27 34 views
0

我下載數據,並在viewDidLoad()使用下面的代碼處理它:斯威夫特/ NSURLSession JSON下載/意外發現零而展開的可選值

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)打印出正確的解釋。 print(dollarToDollarString)打印出正確的期望字符串我想要爲:「可選(1.1303)」

但是,當我想有一個按鈕被按下,與使用String在dollarToDollarString

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

我得到unexpectedly found nil while unwrapping an Optional value on let dollarExchangeRateDouble = Double(dollarExchangeRateStr)!

我錯過了什麼?爲什麼字符串nil?我早些時候打印了正確的值...爲什麼一旦我想稍後使用它,爲什麼它不再是我的字符串的一部分?非常感謝幫助。

+0

它是打印擴展。與print()相同# –

+0

那麼SpeedLog.print(「DOLLAR下載」,dollarExchangeRateStr)是什麼打印出來的? –

+0

'dollarBtnFunc [405]:DOLLAR downloaded可選(0.88472)' –

回答

1

您的問題是在這兩條線:

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

dollarToDollarDict.valueForKey("EUR")返回一個可選的,因此dollarToDollarNSNumber是可選的。

調用String初始化一個可選的給串"Optional(...)"所以當你以後該字符串傳遞給Double初始化失敗,因爲它在它的字母。

你需要做這樣的事情來解開你從valueForKey獲取的價值:

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

謝謝!不只是,你做到了。你解釋了它,所以我明白了......非常感謝你! –

1

我相信你的問題在於將dollarExchangeRateStr轉換爲Double。 Double(「foo」)返回一個可選項,可能會導致轉換失敗,因此它爲零,當解壓縮時會失敗。

變化

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

它看起來從你的評論認爲,dollarExchangeRateStr也是可選的,這意味着你將需要打開那也請注意,如果讓exchangeRateStr = dollarExchangeRateStr

乾杯!

+0

感謝您的努力 –

+0

樂於幫助! –

相關問題