使用 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" 的更多信息
希望对您有所帮助!
我正在尝试使用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" 的更多信息希望对您有所帮助!