Array di Swift mendukung operator + = untuk menambahkan konten dari satu Array ke Array yang lain. Apakah ada cara mudah untuk melakukannya untuk kamus?
misalnya:
var dict1 = ["a" : "foo"]
var dict2 = ["b" : "bar"]
var combinedDict = ... (some way of combining dict1 & dict2 without looping)
dictionary
swift
rustyshelf
sumber
sumber
fromDict.forEach {intoDict[$0] = $1}
Jawaban:
Anda dapat menentukan
+=
operator untukDictionary
, misalnya,sumber
@assignment
danreturn
, Anda sudah bermutasi ke kiri. Sunting: sebenarnya, meskipun saya tidak mendapatkan kesalahan, saya pikir@assignment
harus tetap.func +=<K, V> (inout left: [K : V], right: [K : V]) { for (k, v) in right { left[k] = v } }
public static func +=(lhs: inout [Key: Value], rhs: [Key: Value]) { rhs.forEach({ lhs[$0] = $1}) }
Dalam Swift 4, seseorang harus menggunakan
merging(_:uniquingKeysWith:)
:Contoh:
sumber
[NSMutableDictionary addEntriesFromDictionary:]
.Bagaimana tentang
Itu menambahkan semua kunci dan nilai dict2 ke dalamct1.
sumber
Closure tuple parameter '(key: _, value: _)' does not support destructuring
(setidaknya pada saat penulisan ini). Seseorang perlu merestrukturisasi penutupan sesuai dengan [jawaban stackoverflow ini] ( stackoverflow.com/questions/44945967/… ):Saat ini, melihat Referensi Perpustakaan Swift untuk Kamus, tidak ada cara untuk dengan mudah memperbarui kamus dengan yang lain.
Anda dapat menulis ekstensi untuk melakukannya
sumber
Swift 4 menyediakan
merging(_:uniquingKeysWith:)
, jadi untuk kasus Anda:Penutupan steno mengembalikan
$1
, oleh karena itu nilai dict2 akan digunakan ketika ada konflik dengan kunci.sumber
- (void)addEntriesFromDictionary:(NSDictionary<KeyType, ObjectType> *)otherDictionary;
. Berkenaan dengan apa yang harus dilakukan dengan duplikat, itu menyatakan bahwa: "Jika kedua kamus berisi kunci yang sama, objek nilai kamus sebelumnya untuk kunci itu dikirim pesan rilis, dan objek nilai baru mengambil tempatnya.", Jadi dalam versi Swift, atau dalam gabungan (_: uniquingKeysWith :), mengembalikan nilai kedua,,$1
sama dengan apa yangaddEntriesFromDictionary
dilakukannya.Itu tidak dibangun ke dalam pustaka Swift tetapi Anda dapat menambahkan apa yang Anda inginkan dengan overloading operator, misalnya:
Ini membebani
+
operator untuk Kamus yang sekarang dapat Anda gunakan untuk menambahkan kamus dengan+
operator, misalnya:sumber
map
dan menghapusfor (k, v)...
loop pertama jika Anda mendeklarasikanleft
parameter sebagaivar
dan kemudian hanya menyalin nilai dariright
dalamnya.+
operator infix.+
kelebihan operator bukan metode baikDictionary
, ini adalah fungsi sederhana. Perubahan yang Anda buat padaleft
parameter variabel tidak akan terlihat di luar fungsi.Swift 3:
sumber
func merged(with dictionary: Dictionary<Key,Value>) -> Dictionary<Key,Value> {
var copy = self
dictionary.forEach { copy.updateValue($1, forKey: $0) }
return copy
}
Swift 2.0
sumber
union
fungsi memiliki nilai yang dikirimkan ke dalamnya menjadivar
, berarti kamus disalin dapat bermutasi. Ini sedikit lebih bersih daripadafunc union(dictionary: Dictionary) -> Dictionary { var dict2 = dictionary; dict2.unionInPlace(self); return dict2 }
, jika hanya dengan satu baris.var dictionary = dictionary
. Dari sini: github.com/apple/swift-evolution/blob/master/proposals/…<Key, Value>
keDictionary
s.Kekal
Saya lebih suka menggabungkan / menyatukan kamus abadi dengan
+
operator jadi saya mengimplementasikannya seperti:Yg mungkin berubah
sumber
right.reduce(left)
, setidaknya itu adalah perilaku yang diharapkan (dan itu adalah perilaku dari contoh kedua Anda) - yaitu.["A":1] + ["A":2]
harus output["A":2]
Tidak perlu memiliki ekstensi kamus apa pun sekarang. Kamus Swift (Xcode 9.0+) telah mendapatkan fungsionalitas untuk ini. Silahkan lihat di sini . Di bawah ini adalah contoh cara menggunakannya
sumber
oldDictionary.merge(newDictionary) { $1 }
Varian yang lebih mudah dibaca menggunakan ekstensi.
sumber
Anda bisa mencoba ini
sumber
Anda juga dapat menggunakan pengurangan untuk menggabungkannya. Coba ini di taman bermain
sumber
d
danp
?Saya merekomendasikan Perpustakaan SwifterSwift . Namun, jika Anda tidak ingin menggunakan seluruh pustaka dan semua tambahannya yang hebat, Anda bisa memanfaatkan ekstensi Kamus mereka:
Swift 3+
sumber
Anda dapat mengulangi kombinasi Nilai Kunci dengan nilai yang ingin Anda gabungkan dan menambahkannya melalui metode updateValue (forKey :):
Sekarang semua nilai dictionaryTwo ditambahkan ke dictionaryOne.
sumber
Sama dengan jawaban @ farhadf tetapi diadopsi untuk Swift 3:
sumber
Swift 3, ekstensi kamus:
sumber
Beberapa kelebihan beban yang lebih ramping untuk Swift 4:
sumber
Anda dapat menambahkan
Dictionary
ekstensi seperti ini:Kemudian penggunaan adalah sebagai sederhana sebagai berikut:
Jika Anda lebih menyukai kerangka kerja yang juga mencakup beberapa fitur yang lebih berguna maka checkout HandySwift . Cukup impor ke proyek Anda dan Anda dapat menggunakan kode di atas tanpa menambahkan sendiri ekstensi ke proyek.
sumber
Tidak perlu ekstensi atau fungsi tambahan lagi. Anda bisa menulis seperti itu:
sumber
Kamu bisa memakai,
sumber
Anda dapat menggunakan fungsi bridgeToObjectiveC () untuk membuat kamus menjadi NSDictionary.
Akan seperti berikut ini:
Kemudian Anda dapat mengkonversi kembali NSDictionary (menggabungkan) atau melakukan apa pun.
sumber
Hasilnya adalah NSMutableDictionary bukan kamus yang diketik Swift, tetapi sintaks untuk menggunakannya adalah sama (
out["a"] == 1
dalam hal ini) sehingga Anda hanya akan memiliki masalah jika Anda menggunakan kode pihak ketiga yang mengharapkan kamus Swift, atau benar-benar perlu pengecekan tipe.Jawaban singkatnya di sini adalah Anda benar-benar harus mengulang. Bahkan jika Anda tidak memasukkannya secara eksplisit, itulah metode yang Anda panggil (addEntriesFromDictionary: di sini) akan dilakukan. Saya akan menyarankan jika Anda sedikit tidak jelas mengapa hal itu terjadi, Anda harus mempertimbangkan bagaimana Anda akan menggabungkan node daun dari dua B-tree.
Jika Anda benar-benar membutuhkan jenis kamus asli Swift sebagai gantinya, saya sarankan:
Kelemahan dari pendekatan ini adalah bahwa indeks kamus - namun demikian dilakukan - dapat dibangun kembali beberapa kali dalam loop, jadi dalam praktiknya ini sekitar 10x lebih lambat daripada pendekatan NSMutableDictionary.
sumber
Semua tanggapan ini rumit. Ini solusi saya untuk Swift 2.2:
sumber
Kebutuhan saya berbeda, saya perlu menggabungkan set data bersarang tidak lengkap tanpa clobbering.
Ini lebih sulit daripada yang saya inginkan. Tantangannya adalah dalam pemetaan dari pengetikan dinamis ke pengetikan statis, dan saya menggunakan protokol untuk menyelesaikannya.
Juga patut dicatat adalah bahwa ketika Anda menggunakan sintaks literal kamus, Anda benar-benar mendapatkan jenis dasar, yang tidak mengambil ekstensi protokol. Saya membatalkan upaya saya untuk mendukung itu karena saya tidak dapat menemukan mudah untuk memvalidasi keseragaman elemen koleksi.
sumber
Cepat 2.2
sumber
Saya hanya akan menggunakan perpustakaan Dollar .
https://github.com/ankurp/Dollar/#merge---merge-1
Menggabungkan semua kamus bersama-sama dan kamus yang terakhir menimpa nilai pada kunci yang diberikan
sumber
Ini adalah ekstensi yang bagus yang saya tulis ...
menggunakan:
Kemudian, dict1 akan dimodifikasi menjadi
sumber