无法强制解包非可选类型的值:避免"可选()"

时间:2015-11-18 16:27:43

标签: xcode swift

我已经将NSUserDefaults中的玩家技能保存为字典,但是当我想访问它时,xcode表示"不能强制解包非可选类型的值"。当我删除"!"它写出"可选(1)"在哪里我想摆脱" Optional()"。我怎样才能写出" 1"?

if let playerDic = defaults.objectForKey("Player") as? [String: Int] {
    lbLevel.setText(String(playerDic!["level"]))
}

变成

"Cannot force unwrap value of non-optional type"

,其中

if let playerDic = defaults.objectForKey("Player") as? [String: Int] {
    lbLevel.setText(String(playerDic["level"]))
}

变成

Optional(1)

2 个答案:

答案 0 :(得分:5)

你已经在if let绑定中打开了playerDic。只需按照错误消息告诉您放下力量展开。

if let playerDic = defaults.objectForKey("Player") as? [String: Int] {
    lbLevel.setText(String(playerDic["level"]))
}

<强>更新 抱歉,只看到了您的更新。所以playerDic不是可选的,但为键返回的值是可选项。如果你要求一个不在字典中的键的值,你将获得一个值为nil的可选值。

if let 
      playerDic = defaults.objectForKey("Player") as? [String: Int],
      level = playerDic["level"]   {
    lbLevel.setText("\(level)")
}

在这里,您可以在单个if中绑定多个值。此外,您可以使用String(级别)或使用字符串插值&#34;(级别)&#34;取决于你喜欢什么。

答案 1 :(得分:0)

最后的爆炸(!):

您正试图将可选参数传递给不接收nilString(optional)的方法来解决此问题,只需在String(optional!):末尾用(!)将其解包即可。

if let playerDic = defaults.objectForKey("Player") as? [String: Int] {
    lbLevel.setText(String(playerDic["level"]!)) <-- the bang at the end
}