我从 NSUserDefaults 得到的对象(字典)有问题

Problems with the object ( dictionary ) I get from NSUserDefaults

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

全局变量:

// 玩家 1 的初始分数为 0 ,玩家 ​​2 也是。

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

警告:

Treating a forced downcast to 'Int' as optional will never produce 'nil'

在线 ->

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() 调用函数,因为这是我尝试在应用程序返回时加载以前的分数的逻辑。

一定是概念错误。可选对象一直让我陷入困境。 ;)

提前致谢

您可以将其视为 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)

如果键没有改变,不要在用户默认值中使用可选值

AppDelegate中用默认值注册键,将代码放在awakeFromNib()中或更好地放在init()

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

如果 none 个密钥已写入磁盘,则用户默认值采用默认值,否则为实际值。

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

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

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

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

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

你最好直接从 userdefaults 中提取整数值

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