高分的 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()
}
我已经尝试同步保存的数据,但我的游戏仍然没有存储最高分。如果 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(_:)
returnsAnyObject?
然后,我们进入代码:
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()
}