Seit Swift 4 können Sie dies sehr einfach tun. Es gibt zwei neue Initialisierer, die ein Wörterbuch aus einer Folge von Tupeln (Schlüssel- und Wertepaare) erstellen. Wenn die Schlüssel garantiert eindeutig sind, können Sie Folgendes tun:
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"]
Dies schlägt mit einem Laufzeitfehler fehl, wenn ein Schlüssel dupliziert wird. In diesem Fall können Sie diese Version verwenden:
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"]
Dies verhält sich wie Ihre for-Schleife. Wenn Sie keine Werte "überschreiben" und sich an die erste Zuordnung halten möchten, können Sie Folgendes verwenden:
Dictionary(persons.map { ($0.position, $0.name) }) { first, _ in first }
=> [1: "Franz", 2: "Heinz"]
Swift 4.2 fügt einen dritten Initialisierer hinzu, der Sequenzelemente in einem Wörterbuch gruppiert. Wörterbuchschlüssel werden durch einen Abschluss abgeleitet. Elemente mit demselben Schlüssel werden in derselben Reihenfolge wie in der Sequenz in ein Array eingefügt. Auf diese Weise können Sie ähnliche Ergebnisse wie oben erzielen. Zum Beispiel:
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]
oder[position:[name]]
? Wenn Sie zwei Personen an derselben Position haben, behält Ihr Wörterbuch nur die letzte in Ihrer Schleife gefundene Person bei. Ich habe eine ähnliche Frage, für die ich nach einer Lösung suche, aber ich möchte, dass das Ergebnis so aussieht[1: [p1, p3], 2: [p2]]