使用NSUserDefaults保存并加载Swift中的高分

我在尝试比较我的分数和高分时,看到哪一个更大,然后保存,遇到一些问题。 我认为问题在于高分和比分的比较和节省。 帮助将不胜感激!

//Comparison between score and highscore if score > highscore { let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults() highscore = defaults.valueForKey("highscore")?.integerValue ?? 0 defaults.setInteger(score, forKey: "highscore") defaults.synchronize() highscoreString = String(highscore) highscoreLabel.text = highscoreString } 

全页代码 – https://github.com/SRL311/Highscore/blob/master/Highscore (对不起,关于令人困惑的首都和小型病房)

您还可以使用getter和setter创build一个新的NSUserDefault属性,以自动检查您尝试保存的分数是否高于实际高分:

更新: Xcode 8.2.1•Swift 3.0.2

 extension UserDefaults { static let highScoreIntegerKey = "highScoreInteger" static let highScoreDoubleKey = "highScoreDouble" var highScore: Int { get { print("High Score:", integer(forKey: UserDefaults.highScoreIntegerKey)) return integer(forKey: UserDefaults.highScoreIntegerKey) } set { guard newValue > highScore else { print("\(newValue) ≤ \(highScore) Try again") return } set(newValue, forKey: UserDefaults.highScoreIntegerKey) print("New High Score:", highScore) } } func resetHighScore() { removeObject(forKey: UserDefaults.highScoreIntegerKey) print("removed object for highScoreIntegerKey") } var highScoreDouble: Double { get { return double(forKey: UserDefaults.highScoreDoubleKey) } set { guard newValue > highScoreDouble else { print("\(newValue) ≤ \(highScoreDouble) Try again") print("Try again") return } set(newValue, forKey: UserDefaults.highScoreDoubleKey) print("New High Score:", highScoreDouble) } } func resetHighScoreDouble() { removeObject(forKey: UserDefaults.highScoreDoubleKey) print("removed object for highScoreDoubleKey") } } 

在项目中进行testing(从Swift 2开始,不能在游乐场工作):

 UserDefaults().resetHighScore() UserDefaults().highScore // High Score = 0 UserDefaults().highScore = 100 // New High Score = 100 UserDefaults().highScore = 50 // 50 < 100 Try again UserDefaults().highScore // 100 UserDefaults().highScore = 150 // New High Score = 150 UserDefaults().highScore // 150 

Xcode 7.2•Swift 2.1.1

 extension NSUserDefaults { var highScore: Int { get { print("High Score = " + integerForKey("highScore").description) return integerForKey("highScore") } set { guard newValue > highScore else { print("\(newValue) ≤ \(highScore) Try again") return } setInteger(newValue, forKey: "highScore") print("New High Score = \(highScore)") } } func resetHighScore() { removeObjectForKey("highScore") print("removed object for key highScore") } var highScoreDouble: Double { get { return doubleForKey("highScoreDouble") } set { guard newValue > highScoreDouble else { print("Try again") return } setDouble(newValue, forKey: "highScoreDouble") print("New High Score = \(highScoreDouble)") } } func resetHighScoreDouble() { removeObjectForKey("highScoreDouble") print("removed object for key highScoreDouble") } } 

仔细阅读你的代码,你应该能够find错误。

  1. 你没有把score分配给highscore
  2. 没有理由从NSUserDefaults获得旧的highscore
  3. 没有必要synchronize

Swift 2:你已经在userDefaults中设置了一个整数值,所以你可以尝试使用defaults.integerForKey(score, forKey: "highscore")来检索它。