从Dictionary创建有序数组

时间:2018-06-05 15:04:11

标签: arrays swift dictionary

这是我应该知道的一个基本的事情,但是在深层次上并不知道,因此感到困惑。字典似乎是无序的键和值列表。我想创建一个有序的键和值列表,以便我可以排序和跟踪顺序。我认为这意味着我必须将字典转换为具有键和值以及索引值即0,1,2,3等的多维数组。

如果我的字典如下所示:

var myScores = [String: Float]()
myScores = ["player1":22,"player2":33]

如何将其转换为Array,其中player1:22是第一个元素,player2:33是第二个元素?

修改

不创建struct的替代方法是以字典的形式创建一个空字典数组,然后将字典附加到数组中。

var myArray = [[String: Float]]()//note double brackets
propArray.append(myScores)

2 个答案:

答案 0 :(得分:2)

你想要的是一系列结构。

struct Score {
    let playerName: String
    let score: Int
}

let scores = [Score(playerName: "player1", score: 22),
              Score(playerName: "player2", score: 33),
             ]
let sortedScores = scores.sorted(by: { $0.playerName < $1.playerName })

要从字典中获取键值对很简单,但它会强制您使用元组,这不是特别友好的类型。即便如此,它也是这样做的:

let sortedScores = myScores.sorted { $0.key < $1.key }

这将创建:

[(key: "player1", value: 22.0), (key: "player2", value: 33.0)]

或者

for (name, score) in myScores.sorted(by: { $0.key < $1.key }) {
    print(name, score)
}

答案 1 :(得分:0)

您可以保持字典不变。一种可能的解决方案是创建一个只包含所需顺序的键的数组。然后,您可以迭代键数组并访问字典的元素。

var myScores: [String:Float] = ["player1":22, "player2":33]
var myPlayers = myScores.keys.sorted()

for player in myPlayers {
    let score = myScores[player]
}

当您想以某种特定顺序显示数据时,这种方法很有效,例如在表格视图中。