Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在Swift中通过用户默认值保存游戏分数排名的最佳方法_Ios_Swift_Nsuserdefaults - Fatal编程技术网

Ios 在Swift中通过用户默认值保存游戏分数排名的最佳方法

Ios 在Swift中通过用户默认值保存游戏分数排名的最佳方法,ios,swift,nsuserdefaults,Ios,Swift,Nsuserdefaults,我经常制作游戏应用程序来保存游戏分数并显示它们的排名,如下所示。它从不使用任何服务器。用户可以在应用程序中查看自己的游戏分数 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 [

我经常制作游戏应用程序来保存游戏分数并显示它们的排名,如下所示。它从不使用任何服务器。用户可以在应用程序中查看自己的游戏分数

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对象

通过这种方式,数据可以持久化,并且可以通过多种方式轻松排序和过滤

您可以保存所有分数并获取排名靠前的分数,或者管理要保存的分数并始终获取所有分数

获取最高分后,将分数值降序,按排名对其进行排序


是一款功能强大的免费赠品

尝试使用CoreData存储用户分数

创建一个属性为level和scoreValue的Score对象

通过这种方式,数据可以持久化,并且可以通过多种方式轻松排序和过滤

您可以保存所有分数并获取排名靠前的分数,或者管理要保存的分数并始终获取所有分数

获取最高分后,将分数值降序,按排名对其进行排序


是一款功能强大的免费赠品

如果您想使用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]]

如果要使用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]]

排名不应该在运行时计算,因为它取决于其他用户的分数吗?@TheTiger,事实上,你这样说让我意识到排名根本不应该是一个存储属性。当你拿到高分时,你会把他们从高到低排序,这就是对他们的排名。感谢您提到这一点,我将更新我的答案:@TheTiger,并根据更新回答您的问题,只有在获取分数时才会计算排名。不应该在运行时计算排名,因为这取决于其他用户的分数吗?@TheTiger,实际上,你这么说让我意识到等级根本不应该是一种存储属性。当你拿到高分时,你会把他们从高到低排序,这就是对他们的排名。感谢您提到这一点,我将更新我的答案:@TheTiger,并根据更新回答您的问题,只有在获取分数时才会计算排名。