Swift - 将数组转换为字典

bbw*_*ner 5 arrays dictionary swift

我只想将一个玩家名称数组转换成字典记分牌,给每个人一个初始分数为0.

含义...

var playerNames = ["Harry", "Ron", "Hermione"]
Run Code Online (Sandbox Code Playgroud)

变得 ......

var scoreBoard: [String:Int] = [ "Ron":0, "Harry":0, "Hermione":0 ]
Run Code Online (Sandbox Code Playgroud)

这是我第一次提出一个问题,但我完全陷入了这么简单的困境,我发现的所有方法/问题都是以某种方式解决的.我尝试过以各种方式使用reduce,但最终总是很短.提前致谢!

小智 15

这是我喜欢使用的快速衬垫:

let scoreboard = playerNames.reduce(into: [String: Int]()) { $0[$1] = 0 }
Run Code Online (Sandbox Code Playgroud)

  • 使用类型推断使它更短……`let scoreboard = playerNames.reduce(in:[:]){$ 0 [$ 1] = 0}` (3认同)

Mar*_*n R 6

如果已知玩家名称各不相同,那么您可以

let playerNames = ["Harry", "Ron", "Hermione", "Ron"]

var scoreBoard = Dictionary(uniqueKeysWithValues: zip(playerNames,
                                                      repeatElement(0, count: playerNames.count)))

print(scoreBoard) // ["Harry": 0, "Ron": 0, "Hermione": 0]
Run Code Online (Sandbox Code Playgroud)

此处zip用于创建一个玩家/得分对序列,从中创建字典。

备注:最初我曾经AnySequence { 0 }生成零。亚历山大建议使用repeatElement()代替,它的优点是将正确的所需容量传递给字典初始化器。


Con*_*nor 5

reduce 绝对是正确使用更困难的内置函数之一,但这就是您想要的。

let names = ["Harry", "Ron", "Hermione"]
let scoreboard: [String: Int] = names.reduce(into: [:], { result, next in
    result[next] = 0
})
Run Code Online (Sandbox Code Playgroud)

它带有2个参数:初始值(在我们的示例中为空字典[:])和一个闭包,该闭包使用数组中的每个元素更新结果。此闭包有2个参数,resultnext。我们要result基于next元素进行更新。我们的闭包通过将其设置result[next]为0来实现。


HAK*_*HAK 2

您可以按照以下方法执行此操作:

var playerNames = ["Harry", "Ron", "Hermione"]

var dictionary = [String: Int]()
for player in playerNames {
    dictionary[player] = 0
}
Run Code Online (Sandbox Code Playgroud)