Depuis Swift 4 vous pouvez le faire très facilement. Il y a deux nouveaux initialiseurs que construire un dictionnaire à partir d'une séquence de n-uplets (paires de clés et de valeurs). Si les clés sont uniques, vous pouvez effectuer les opérations suivantes:
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"]
Cela échouera avec une erreur d'exécution si une touche est dupliqué. Dans ce cas, vous pouvez utiliser cette version:
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"]
Il se comporte comme votre boucle for. Si vous ne voulez pas "écraser" les valeurs et le bâton à la première cartographie, vous pouvez utiliser ceci:
Dictionary(persons.map { ($0.position, $0.name) }) { first, _ in first }
=> [1: "Franz", 2: "Heinz"]
Swift 4.2 ajoute un troisième initialiseur de groupes d'éléments de la séquence dans un dictionnaire. Les clés de dictionnaire sont obtenus par une fermeture. Éléments avec la même clé sont mis dans un tableau dans le même ordre que dans la séquence. Cela vous permet d'obtenir le même résultat que ci-dessus. Par exemple:
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)]