Swift - 使用NSUserDefaults保存高分

15

我正在使用Swift制作游戏。我想使用NSUserDefaults保存用户的最高分。我知道如何在我的AppDelegate文件中创建一个新的NSUserDefaults变量:

let highscore: NSUserDefaults = NSUserDefaults.standardUserDefaults()

但是我该如何在我的视图控制器中设置/获取它呢?


5
不要使用NSUserDefaults,它并不是为此而设计的,它不是一个数据库。相反,应该使用NSArchiver将数据保存到文件中。 - zaph
5个回答

37

首先,NSUserDefaults是一个字典(我认为是NSDictionary)。每个应用程序都有自己的用户默认设置,因此您无法从任何其他应用程序访问用户默认设置。

如果用户(玩游戏的人)创造了新的最高分,您必须像这样保存该最高分:

let highscore = 1000
let userDefaults = NSUserDefaults.standardUserDefaults()
userDefaults.setValue(highscore, forKey: "highscore")
userDefaults.synchronize() // don't forget this!!!!

然后,当您想要获取用户制作的最佳高分时,您需要像这样从字典中“读取”高分:

if let highscore = userDefaults.valueForKey("highscore") {
    // do something here when a highscore exists
}
else {
    // no highscore exists
}

4
我认为if语句应该更像这样:if let highscore = userDefaults.valueForKey("highscore") { - Mike S
1
你可能想使用 objectForKey 而不是 valueForKey。后者会经过键值编码,可能会产生意想不到的行为。 - Catfish_Man
5
根据这篇文章,在iOS 8及其以后的版本中,不应使用synchronize方法。 - Suragch
2
同步只有在用户实际上无法等待自动完成时才是必要的。 - jose920405
1
为什么这个答案如此受欢迎?几乎每一行都是错误的。它使用了错误的方法。除非你有明确而具体的原因,否则不要使用KVC。而且你不需要调用synchronize。jigar的答案使用了适当的Swift 2 API(除了创建一个新的NSUserDefaults实例)。 - rmaddy
显示剩余4条评论

17

在 Swift 中

let highScore = 1000
let userDefults = UserDefaults.standard //returns shared defaults object.

储蓄:

userDefults.set(highScore, forKey: "highScore") //Sets the value of the specified default key to the specified integer value.

检索中:

if let highScore = userDefults.value(forKey: "highScore") { //Returns the integer value associated with the specified key.
        //do something here when a highscore exists
    } else {
        //no highscore exists
}

感谢 @beef。最初编辑了您的答案,但社区建议将其写成单独的答案。 - Ashok R
有人可以解释一下为什么被踩吗?这样我就可以改进自己了。 - Ashok R
不要使用 UserDefaults value(forKey:) 读取 Int 值,而应该使用 UserDefaults integer(forKey:)。除非你有明确的特定原因,否则不要使用 KVC。 - rmaddy

3

Swift 5

设置值

UserDefaults.standard.set("TEST", forKey: "Key") // 设置字符串

检索值

UserDefaults.standard.string(forKey: "Key") // 获取字符串

删除值

UserDefaults.standard.removeObject(forKey: "Key")


1
有没有任何理由给我踩一下? - Mithra Singam

0
var defaults=NSUserDefaults()
var highscore=defaults.integerForKey("highscore")

if(Score>highscore)
{
    defaults.setInteger(Score, forKey: "highscore")
}
var highscoreshow=defaults.integerForKey("highscore")

lblHighScore.text="\(highscoreshow)
println("hhScore reported: \(lblHighScore.text)")
lblPlayScore.text="\(Score)"
println("play reported: \(lblPlayScore.text)")

1
不要创建自己的 NSUserDefaults 实例。使用 NSUserDefaults.standardUserDefaults() - rmaddy

-2
你可以使用下面的代码片段:
// Your score var

var score:Int = 0

//save

score = NSUserDefaults.standardUserDefaults().setInteger(score, forKey: "score")

// load without starting value nil problems

if NSUserDefaults.standardUserDefaults().setIntergerForKey:("score") != nil {

score = NSUserDefaults.standardUserDefaults().setIntergerForKey:("score")

}

我认为这个被踩是因为你不需要为这些函数存储变量。 - Liam Bolling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接