从Swift 4开始,您可以轻松完成此操作。有两个 新的初始化程序根据元组序列(键和值对)构建字典。如果保证键是唯一的,则可以执行以下操作:
let persons = [Person(name: "Franz", position: 1),
Person(name: "Heinz", position: 2),
Person(name: "Hans", position: 3)]
Dictionary(uniqueKeysWithValues: persons.map { ($0.position, $0.name) })
=> [1: "Franz", 2: "Heinz", 3: "Hans"]
如果任何键重复,将失败并显示运行时错误。在这种情况下,您可以使用以下版本:
let persons = [Person(name: "Franz", position: 1),
Person(name: "Heinz", position: 2),
Person(name: "Hans", position: 1)]
Dictionary(persons.map { ($0.position, $0.name) }) { _, last in last }
=> [1: "Hans", 2: "Heinz"]
这相当于您的for循环。如果您不想“覆盖”值并坚持使用第一个映射,则可以使用以下方法:
Dictionary(persons.map { ($0.position, $0.name) }) { first, _ in first }
=> [1: "Franz", 2: "Heinz"]
Swift 4.2添加了第三个初始化器,该初始化器将序列元素分组为字典。字典键由闭包派生。具有相同键的元素以与序列中相同的顺序放入数组中。这使您可以获得与上述类似的结果。例如:
Dictionary(grouping: persons, by: { $0.position }).mapValues { $0.last! }
=> [1: Person(name: "Hans", position: 1), 2: Person(name: "Heinz", position: 2)]
Dictionary(grouping: persons, by: { $0.position }).mapValues { $0.first! }
=> [1: Person(name: "Franz", position: 1), 2: Person(name: "Heinz", position: 2)]
[position:name]
还是[position:[name]]
?如果您有两个人处于同一位置,则您的字典将仅保留循环中遇到的最后一个人。...我有一个类似的问题,我正在尝试寻找解决方案,但我希望结果像[1: [p1, p3], 2: [p2]]