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 存储用户分数。

使用 levelscoreValue 作为属性创建一个 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]]