我从NSUserDefaults

时间:2015-08-25 18:36:48

标签: ios xcode swift nsuserdefaults swift2

虽然该应用程序运行良好但我仍然在我的两个代码行上收到此警告消息。我想要做的是从两个玩家那里得到以前的分数:

全局变量:

//玩家1的初始得分为0,玩家2也是如此。

var countWins:Dictionary = ["1":0,"2":0]

警告:

  

将强制向下转换为'Int'作为可选项永远不会产生   '零'

在线上 - >

countWins["1"] = defaults.objectForKey("scoreOne") as! Int
countWins["2"] = defaults.objectForKey("scoreTwo") as! Int

整体功能:

func loadScores()
{

    let defaults = NSUserDefaults.standardUserDefaults()

    if defaults.objectForKey("scoreOne") != nil && 

    defaults.objectForKey("scoreTwo") != nil 

{
    countWins["1"] = defaults.objectForKey("scoreOne") as! Int
    countWins["2"] = defaults.objectForKey("scoreTwo") as! Int


        scorePlayerOne.text = String(countWins["1"]!)
        scorePlayerTwo.text = String(countWins["2"]!)

    }
}

我不知道它是否重要,但我从func viewDidLoad()调用该函数,因为它是逻辑我尝试在应用程序返回时加载以前的分数。

一定是概念错误。可选对象让我一直遇到麻烦。 ;)

提前致谢

4 个答案:

答案 0 :(得分:1)

您可以将其视为conditional向下转换为Int ,而不是optional

countWins["1"] = defaults.objectForKey("scoreOne") as? Int
countWins["2"] = defaults.objectForKey("scoreTwo") as? Int

否则,如果您需要可选项,请在其周围添加括号以使警告静音:

countWins["1"] = (defaults.objectForKey("scoreOne") as! Int)
countWins["2"] = (defaults.objectForKey("scoreTwo") as! Int)

答案 1 :(得分:1)

如果密钥没有改变,请不要在用户默认值中使用选项

AppDelegate注册具有默认值的密钥时,将代码放在awakeFromNib()或更好的init()

let defaults = NSUserDefaults.standardUserDefaults()
let defaultValues = ["scoreOne" : 0, "scoreTwo" : 0];
defaults.registerDefaults(defaultValues)

如果尚未将任何键写入磁盘,则用户默认值采用默认值,否则为实际值。

现在您可以将值加载为非选项

func loadScores()
{
  let defaults = NSUserDefaults.standardUserDefaults()
  let scoreOne = defaults.integerForKey("scoreOne")
  let scoreTwo = defaults.integerForKey("scoreTwo")
  countWins["1"] = scoreOne
  countWins["2"] = scoreTwo

  scorePlayerOne.text = String(scoreOne)
  scorePlayerTwo.text = String(scoreTwo)
}

没有可选绑定 - 没有类型转换。

答案 2 :(得分:1)

您应该使用可选绑定。它将消除您的警告,并提高您的应用程序的安全性。

var countWins:Dictionary = ["1":0,"2":0]

func loadScores() {

    let defaults = NSUserDefaults.standardUserDefaults()

    if let scoreOne = defaults.objectForKey("scoreOne") as? Int,
       let scoreTwo = defaults.objectForKey("scoreTwo") as? Int {

        countWins["1"] = scoreOne
        countWins["2"] = scoreTwo

        scorePlayerOne.text = "\(scoreOne)"
        scorePlayerTwo.text = "\(scoreTwo)"
    }
    else {
        scorePlayerOne.text = "\(0)"
        scorePlayerTwo.text = "\(0)"
    }
}

答案 3 :(得分:1)

你最好直接从userdefaults中拉出整数值

countWins["1"] = defaults.integerForKey("scoreOne")
countWins["2"] = defaults.integerForKey("scoreTwo")