高分的 NSUserDefaults 在 iOS 8 模拟器上不起作用?

NSUserDefaults for high score is not working on iOS 8 Simulator?

我已经尝试同步保存的数据,但我的游戏仍然没有存储最高分。如果 highScore 更高,我找不到用 score 替换 highScore 有什么问题。抱歉,我是刚开始学习 iOS 编程的初学者。

init(size: CGSize, score: NSInteger) {

    super.init(size: size)
    self.backgroundColor = SKColor.whiteColor()

    //To save highest score
    var highscore = 0
    let userDefaults = NSUserDefaults.standardUserDefaults()
    if (score > highscore){
        NSUserDefaults.standardUserDefaults().setObject(score, forKey: "highscore")
        NSUserDefaults.standardUserDefaults().synchronize()
    }
    var savedScore: Int = NSUserDefaults.standardUserDefaults().objectForKey("highscore") as! Int


    //To get the saved score
    var savedScore: Int = NSUserDefaults.standardUserDefaults().objectForKey("highscore") as! Int

让我们单步执行您的代码。

首先,用 0 覆盖高分:

//To save highest score
let highscore = 0
let userDefaults = NSUserDefaults.standardUserDefaults()
NSUserDefaults.standardUserDefaults().setObject(highscore, forKey: "highscore")
NSUserDefaults.standardUserDefaults().synchronize()

然后,您要检查 "highscore" 是否在默认值中:

if let highscore: AnyObject = userDefaults.valueForKey("highscore") {

一些注意事项:

  • 这将始终为真,因为您只需设置它
  • 您应该使用 objectForKey(_:),而不是 valueForKey(_:)
  • 但实际上您应该使用 integerForKey(_:) 而不是 objectForKey(_:),因为 highscore 始终是 Int.
  • 您可以删除 : AnyObject 因为 objectForKey(_:) returns AnyObject?

然后,我们进入代码:

    NSUserDefaults.standardUserDefaults().setObject(score, forKey: "highscore")
    NSUserDefaults.standardUserDefaults().synchronize()

您现在正在用 score 覆盖之前添加的 0 分数。

最后,永远不会被调用的 else 块设置 highscore,即使您只是在 if 条件之前这样做了。

}
else {
    NSUserDefaults.standardUserDefaults().setObject(highscore, forKey: "highscore")
    NSUserDefaults.standardUserDefaults().synchronize()
}

从你的代码中不清楚你想做什么,但你确实在你的问题中这样说了:

I can't find whats wrong with the replacing of the highScore with score if it is higher.

嗯,一方面,你永远不会检查哪个更高。

我认为您可能正在尝试这样做:

let defaults = NSUserDefaults.standardUserDefaults()
let highscore = defaults.integerForKey("highscore")

if score > highscore {
    defaults.setInteger(score, forKey: "highscore")
    defaults.synchronize()
}