Sejak Swift 4 Anda dapat melakukan ini dengan sangat mudah. Ada dua penginisialisasi baru yang membangun kamus dari urutan tupel (pasangan kunci dan nilai). Jika kunci dijamin unik, Anda dapat melakukan hal berikut:
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"]
Ini akan gagal dengan error runtime jika ada kunci yang diduplikasi. Dalam hal ini Anda dapat menggunakan versi ini:
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"]
Ini berperilaku sebagai loop for Anda. Jika Anda tidak ingin "menimpa" nilai dan tetap menggunakan pemetaan pertama, Anda dapat menggunakan ini:
Dictionary(persons.map { ($0.position, $0.name) }) { first, _ in first }
=> [1: "Franz", 2: "Heinz"]
Swift 4.2 menambahkan penginisialisasi ketiga yang mengelompokkan elemen urutan ke dalam kamus. Kunci kamus diturunkan dengan penutupan. Elemen dengan kunci yang sama dimasukkan ke dalam array dengan urutan yang sama seperti pada urutannya. Ini memungkinkan Anda untuk mencapai hasil yang serupa seperti di atas. Sebagai contoh:
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]atau[position:[name]]? Jika Anda memiliki dua orang di posisi yang sama, kamus Anda hanya akan menyimpan orang terakhir yang Anda temui dalam lingkaran Anda .... Saya memiliki pertanyaan serupa yang saya coba cari solusinya, tetapi saya ingin hasilnya seperti[1: [p1, p3], 2: [p2]]