Ios Swift/NSURLSession JSON download/在展开可选值时意外发现nil

Ios Swift/NSURLSession JSON download/在展开可选值时意外发现nil,ios,swift,Ios,Swift,我正在下载数据并使用viewDidLoad()中的以下代码进行处理: 打印(dollarToDollarDict)打印出正确的词典打印(dollarToDollarString)打印出我想要的正确字符串:“可选(1.1303)” 但当我想通过按下按钮使用dollarToDollarString中的字符串时,使用: func dollarBtnFunc(button: UIButton!) { if dollarExchangeRateStr != "" { SpeedL

我正在下载数据并使用
viewDidLoad()
中的以下代码进行处理:

打印(dollarToDollarDict)
打印出正确的词典<代码>打印(dollarToDollarString)打印出我想要的正确字符串:“可选(1.1303)”

但当我想通过按下按钮使用
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"
}
让DollareExchangeDouble=Double(DollareExchangeStr)
上展开可选值时,我意外地发现了nil


我错过了什么?为什么字符串
nil
?我之前已经打印了正确的值。。。当我以后想使用它时,为什么它不再是我字符串的一部分?非常感谢您的帮助。

我相信您的问题在于如何将Dollare Exchange STR转换为Double。Double(“foo”)返回一个可选值,该值可能在转换时失败,因此为nil,强制展开时失败

改变

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"
}
从您的评论来看,DollareExchangeRateStr也是可选的,这意味着您也需要将其展开,请注意如果让exchangeRateStr=DollareExchangeRateStr


干杯

我认为您的问题在于将Dollare Exchange Str转换为Dollare Exchange Str。Double(“foo”)返回一个可选值,该值可能在转换时失败,因此为nil,强制展开时失败

改变

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"
}
从您的评论来看,DollareExchangeRateStr也是可选的,这意味着您也需要将其展开,请注意如果让exchangeRateStr=DollareExchangeRateStr


干杯

您的问题在于以下两行:

let dollarToDollarNSNumber = dollarToDollarDict.valueForKey("EUR")
let dollarToDollarString = String(dollarToDollarNSNumber)
dollarToDollarDict.valueForKey(“EUR”)返回可选值,因此
dollartodollarnsumber
是可选值

使用可选参数调用
字符串
初始值设定项会使字符串
成为“可选(…)”
,因此,当您稍后将该字符串传递给
双值
初始值设定项时,它会失败,因为其中包含字母

您需要通过执行以下操作来打开从
valueForKey
获得的值:

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

您的问题存在于以下两行:

let dollarToDollarNSNumber = dollarToDollarDict.valueForKey("EUR")
let dollarToDollarString = String(dollarToDollarNSNumber)
dollarToDollarDict.valueForKey(“EUR”)返回可选值,因此
dollartodollarnsumber
是可选值

使用可选参数调用
字符串
初始值设定项会使字符串
成为“可选(…)”
,因此,当您稍后将该字符串传递给
双值
初始值设定项时,它会失败,因为其中包含字母

您需要通过执行以下操作来打开从
valueForKey
获得的值:

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

这是一个打印扩展。is与
print()
那么SpeedLog.print(“美元下载”,DollareExchangeStr)打印出来的是什么呢?
DollarExchangeStr[405]:美元下载可选(0.88472)
试试让DollareExchangeRateDouble=Double(DollareExchangeStr!)<代码>无法强制展开非可选类型“字符串”的值。
它是打印扩展名。is与
print()
那么SpeedLog.print(“美元下载”,DollareExchangeStr)打印出来的是什么呢?
DollarExchangeStr[405]:美元下载可选(0.88472)
试试让DollareExchangeRateDouble=Double(DollareExchangeStr!)<代码>无法强制展开非可选类型“字符串”的值。
谢谢!不仅如此,你做到了。你解释了,所以我明白了。。。非常感谢你!非常感谢。不仅如此,你做到了。你解释了,所以我明白了。。。非常感谢你!