使用 NSUserDefaults 保存高分

Saving highscore with NSUserDefaults

我正在尝试使用NSUserDefaults加载我在swift中保存的高分,但它只是在加载,我已经运行 通过我能找到的尽可能多的教程,但它让我挠头,因为我的 Highscore 不想加载。谁能找出原因?

以下所有代码都在GameScene.Swift

override func didMoveToView(view: SKView) {

    highScoreLabelNode.fontName = "Helvetica-Bold"
    highScoreLabelNode.position = CGPoint(x: self.frame.size.width / 2.6, y: self.frame.size.height / 1.3 )
    highScoreLabelNode.fontSize = 20
    highScoreLabelNode.alpha = 0.2
    highScoreLabelNode.zPosition = -30
    highScoreLabelNode.text = "Highscore \(score)"

    var highScoreDefault = NSUserDefaults.standardUserDefaults()
        if (highScoreDefault.valueForKey("HighScore") != nil){
    highScore = highScoreDefault.valueForKey("Highscore") as! NSInteger!
    highScoreLabelNode.text = NSString(format: "Highscore : %i", highScore) as String
     }
        self.addChild(highScoreLabelNode)

}

override func update(currentTime: CFTimeInterval) {

    if (score > highScore) {
        highScore = score
        highScoreLabelNode.text = NSString(format: "Highscore : %i", highScore) as String

        var highscoreDefault = NSUserDefaults.standardUserDefaults()
        highscoreDefault.setValue(highScore, forKey: "Highscore")
        highscoreDefault.synchronize()
    }
}

在您提供的代码中,您在更新时设置 "Highscore",但试图获取 "HighScore" 的值(注意大写 S)

这一行:

if (highScoreDefault.valueForKey("HighScore") != nil){

改为:

if (highScoreDefault.valueForKey("Highscore") != nil){

NSUserDefaults 有一个明确的方法来读取和写入整数值。

替换

var highScoreDefault = NSUserDefaults.standardUserDefaults()
if (highScoreDefault.valueForKey("HighScore") != nil){
    highScore = highScoreDefault.valueForKey("Highscore") as! NSInteger!
    highScoreLabelNode.text = NSString(format: "Highscore : %i", highScore) as String
}

let defaults = NSUserDefaults.standardUserDefaults()
highScore = defaults.integerForKey("Highscore")
highScoreLabelNode.text = "\(highScore)"

如果您将密钥注册为Apple recommends,则可以使用非可选变量

值区分大小写,因此找不到值错误。您将值存储为 "Highscore" 但将其读取为 "HighScore",它将始终为空。只需更换钥匙,你就是金色的:)

此外,不要使用 != nil,因为它无效并且在 swift 中不需要;相反,使用 if let 语法,如下所示:

if let highScore = NSUserDefaults.standardUserDefaults().valueForKey("Highscore") as? Int {
    highScoreLabelNode.text = String(format: "Highscore : %d", highScore)
} 

这使您的代码更具可读性,您会发现它更容易编写。您可以在 Swift Documentation.

中阅读有关 "optional chaining" 的更多信息

希望对您有所帮助!