Swift 中 UserDefaults 保存游戏分数排名的最佳方式
The best way to save game score ranking by UserDefaults in Swift
我经常制作游戏应用程序,保存游戏分数并显示他们的排名,如下所示。 (它从不使用任何服务器。用户可以在应用程序中查看自己的游戏分数。)
rank level score
1st level 99 9999
2nd level 87 8875
3rd level 87 8875
4th level 64 6938
5th level 3 320
...
当我实现这样的排名时,我总是使用如下所示的多维数组。
rankArray
level score
[0] [0] //1st
[1] [1] //2nd
[2] [2] //3rd
//[0] = 99, 9999
//[1] = 87, 8875
但是如果你知道保存排名的更好方法,请告诉我。
我建议你使用链表,这是最合适的数据结构。
它允许您在任何位置快速插入元素。
尝试使用 CoreData
存储用户分数。
使用 level
和 scoreValue
作为属性创建一个 Score
对象。
通过这种方式可以持久保存数据,并且可以通过多种方式轻松地对数据进行排序和过滤。
您可以保存所有分数并获取最高分数,或者管理要保存的分数并始终获取所有分数。
获取最高分后,将 scoreValues
降序排序以按排名排序。
CoreData 是一个非常强大的免费赠品
如果你想用 UserDefaults 做,你可以按照下面的方式做:
var rank = [Int:[String:Int]]()
rank[1] = ["level" : 1,
"score" : 99]
rank[2] = ["level" : 30,
"score" : 89]
let gameData = NSKeyedArchiver.archivedData(withRootObject: rank)
UserDefaults.standard .set(gameData, forKey: "score")
let dataFromUserDefaults = UserDefaults.standard .value(forKey: "score")
let retrievedData = NSKeyedUnarchiver.unarchiveObject(with: dataFromUserDefaults as! Data) as? [Int:[String:Int]]
我经常制作游戏应用程序,保存游戏分数并显示他们的排名,如下所示。 (它从不使用任何服务器。用户可以在应用程序中查看自己的游戏分数。)
rank level score
1st level 99 9999
2nd level 87 8875
3rd level 87 8875
4th level 64 6938
5th level 3 320
...
当我实现这样的排名时,我总是使用如下所示的多维数组。
rankArray
level score
[0] [0] //1st
[1] [1] //2nd
[2] [2] //3rd
//[0] = 99, 9999
//[1] = 87, 8875
但是如果你知道保存排名的更好方法,请告诉我。
我建议你使用链表,这是最合适的数据结构。 它允许您在任何位置快速插入元素。
尝试使用 CoreData
存储用户分数。
使用 level
和 scoreValue
作为属性创建一个 Score
对象。
通过这种方式可以持久保存数据,并且可以通过多种方式轻松地对数据进行排序和过滤。
您可以保存所有分数并获取最高分数,或者管理要保存的分数并始终获取所有分数。
获取最高分后,将 scoreValues
降序排序以按排名排序。
CoreData 是一个非常强大的免费赠品
如果你想用 UserDefaults 做,你可以按照下面的方式做:
var rank = [Int:[String:Int]]()
rank[1] = ["level" : 1,
"score" : 99]
rank[2] = ["level" : 30,
"score" : 89]
let gameData = NSKeyedArchiver.archivedData(withRootObject: rank)
UserDefaults.standard .set(gameData, forKey: "score")
let dataFromUserDefaults = UserDefaults.standard .value(forKey: "score")
let retrievedData = NSKeyedUnarchiver.unarchiveObject(with: dataFromUserDefaults as! Data) as? [Int:[String:Int]]