Bagaimana Anda menambahkan Kamus item ke dalam Kamus lain

172

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)
rustyshelf
sumber
fromDict.forEach {intoDict[$0] = $1}
Sazzad Hissain Khan

Jawaban:

171

Anda dapat menentukan +=operator untuk Dictionary, misalnya,

func += <K, V> (left: inout [K:V], right: [K:V]) { 
    for (k, v) in right { 
        left[k] = v
    } 
}
shucao
sumber
1
Oh man, aku berjuang sangat keras dengan menemukan deklarasi generik yang tepat untuk ini, aku mencoba segalanya kecuali ini. Tetapi Anda dapat menjatuhkan @assignmentdan return, Anda sudah bermutasi ke kiri. Sunting: sebenarnya, meskipun saya tidak mendapatkan kesalahan, saya pikir @assignmentharus tetap.
Roland
14
Lebih banyak sintaksis gula: func +=<K, V> (inout left: [K : V], right: [K : V]) { for (k, v) in right { left[k] = v } }
Ivan Vavilov
48
@animal_chin Karena kita harus mengimplementasikan setengah dari bahasa itu sendiri? Iya. Terkesan. Jangan salah paham, saya suka operator kelebihan beban. Saya hanya tidak suka harus menggunakannya untuk fitur dasar yang harus dibangun.
devios1
2
@devios Haha kemudian membuatnya menjadi permintaan tarik ke repo Swift: D Karena jelas Apple tidak dapat arsen
CommaToast
6
Menarik langsung dari Perpustakaan SwifterSwift :public static func +=(lhs: inout [Key: Value], rhs: [Key: Value]) { rhs.forEach({ lhs[$0] = $1}) }
Justin Oroz
99

Dalam Swift 4, seseorang harus menggunakan merging(_:uniquingKeysWith:):

Contoh:

let dictA = ["x" : 1, "y": 2, "z": 3]
let dictB = ["x" : 11, "y": 22, "w": 0]

let resultA = dictA.merging(dictB, uniquingKeysWith: { (first, _) in first })
let resultB = dictA.merging(dictB, uniquingKeysWith: { (_, last) in last })

print(resultA) // ["x": 1, "y": 2, "z": 3, "w": 0]
print(resultB) // ["x": 11, "y": 22, "z": 3, "w": 0]
Vin Gazoil
sumber
1
// bisa berubah: var dictA = ["x": 1, "y": 2, "z": 3] var dictB = ["x": 11, "y": 22, "w": 0] dictA. menggabungkan (dictB, uniquingKeysWith: {(pertama, _) di pertama}) print (dictA) // ["x": 1, "y": 2, "z": 3, "w": 0]
muthukumar
1
Contoh kedua yang ditunjukkan dalam jawaban ini adalah setara dengan [NSMutableDictionary addEntriesFromDictionary:].
orj
92

Bagaimana tentang

dict2.forEach { (k,v) in dict1[k] = v }

Itu menambahkan semua kunci dan nilai dict2 ke dalamct1.

jasongregori
sumber
43
Solusi bagus Sedikit lebih pendek: dict2.forEach {dict1 [$ 0] = $ 1}
Brett
1
Ini solusi yang bagus, tetapi untuk Swift 4, Anda kemungkinan besar akan mendapatkan kesalahan yang menyatakan 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/… ):
JonnyB
78

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

var dict1 = ["a" : "foo"]
var dict2 = ["b" : "bar"]

extension Dictionary {
    mutating func update(other:Dictionary) {
        for (key,value) in other {
            self.updateValue(value, forKey:key)
        }
    }
}

dict1.update(dict2)
// dict1 is now ["a" : "foo", "b" : "bar]
tongkat
sumber
3
Ini adalah penggunaan ekstensi untuk Kamus!
Marc Attinasi
76

Swift 4 menyediakan merging(_:uniquingKeysWith:), jadi untuk kasus Anda:

let combinedDict = dict1.merging(dict2) { $1 }

Penutupan steno mengembalikan $1, oleh karena itu nilai dict2 akan digunakan ketika ada konflik dengan kunci.

samwize
sumber
1
Hanya ingin menunjukkan bahwa ini adalah yang paling ringkas dan paling dekat yang saya temukan dengan apa yang dinyatakan oleh dokumentasi Apple - (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,, $1sama dengan apa yang addEntriesFromDictionarydilakukannya.
Tim Fuqua
31

Itu tidak dibangun ke dalam pustaka Swift tetapi Anda dapat menambahkan apa yang Anda inginkan dengan overloading operator, misalnya:

func + <K,V>(left: Dictionary<K,V>, right: Dictionary<K,V>) 
    -> Dictionary<K,V> 
{
    var map = Dictionary<K,V>()
    for (k, v) in left {
        map[k] = v
    }
    for (k, v) in right {
        map[k] = v
    }
    return map
}

Ini membebani +operator untuk Kamus yang sekarang dapat Anda gunakan untuk menambahkan kamus dengan +operator, misalnya:

var dict1 = ["a" : "foo"]
var dict2 = ["b" : "bar"]

var dict3 = dict1 + dict2 // ["a": "foo", "b": "bar"]
mitos
sumber
1
Anda juga dapat melakukannya untuk + = untuk memperbarui dict (sesuai dengan pertanyaan op).
Rod
3
Anda dapat menghapus mapdan menghapus for (k, v)...loop pertama jika Anda mendeklarasikan leftparameter sebagai vardan kemudian hanya menyalin nilai dari rightdalamnya.
Nate Cook
2
@NateCook yang akan mengubah Kamus yang tidak diharapkan untuk +operator infix.
mythz
Terima kasih untuk itu. Jawaban Anda mungkin lebih akurat untuk kode sampel yang saya posting, sedangkan yang lain lebih sesuai dengan pertanyaan saya. Keburukan saya, bagaimanapun juga memberi Anda berdua suara positif;)
rustyshelf
2
@ mythz Itu tidak benar-benar bermutasi, karena +kelebihan operator bukan metode baik Dictionary, ini adalah fungsi sederhana. Perubahan yang Anda buat pada leftparameter variabel tidak akan terlihat di luar fungsi.
Nate Cook
28

Swift 3:

extension Dictionary {

    mutating func merge(with dictionary: Dictionary) {
        dictionary.forEach { updateValue($1, forKey: $0) }
    }

    func merged(with dictionary: Dictionary) -> Dictionary {
        var dict = self
        dict.merge(with: dictionary)
        return dict
    }
}

let a = ["a":"b"]
let b = ["1":"2"]
let c = a.merged(with: b)

print(c) //["a": "b", "1": "2"]
Pavel Sharanda
sumber
6
sedikit lebih baikfunc merged(with dictionary: Dictionary<Key,Value>) -> Dictionary<Key,Value> { var copy = self dictionary.forEach { copy.updateValue($1, forKey: $0) } return copy }
Alexander Vasenin
16

Swift 2.0

extension Dictionary {

    mutating func unionInPlace(dictionary: Dictionary) {
        dictionary.forEach { self.updateValue($1, forKey: $0) }
    }

    func union(var dictionary: Dictionary) -> Dictionary {
        dictionary.unionInPlace(self)
        return dictionary
    }
}
olsen
sumber
tidak dapat memanggil fungsi bermutasi dari fungsi yang tidak bermutasi seperti itu
njzk2
The unionfungsi memiliki nilai yang dikirimkan ke dalamnya menjadi var, berarti kamus disalin dapat bermutasi. Ini sedikit lebih bersih daripada func union(dictionary: Dictionary) -> Dictionary { var dict2 = dictionary; dict2.unionInPlace(self); return dict2 }, jika hanya dengan satu baris.
MaddTheSane
2
params var yang usang dan akan dihapus di Swift 3. cara pilihan untuk melakukan hal ini sekarang untuk menyatakan var di tubuh: var dictionary = dictionary. Dari sini: github.com/apple/swift-evolution/blob/master/proposals/…
Daniel Wood
Untuk membuat hal-hal lebih aman, tambahkan <Key, Value>ke Dictionarys.
Raphael
12

Kekal

Saya lebih suka menggabungkan / menyatukan kamus abadi dengan +operator jadi saya mengimplementasikannya seperti:

// Swift 2
func + <K,V> (left: Dictionary<K,V>, right: Dictionary<K,V>?) -> Dictionary<K,V> {
    guard let right = right else { return left }
    return left.reduce(right) {
        var new = $0 as [K:V]
        new.updateValue($1.1, forKey: $1.0)
        return new
    }
}

let moreAttributes: [String:AnyObject] = ["Function":"authenticate"]
let attributes: [String:AnyObject] = ["File":"Auth.swift"]

attributes + moreAttributes + nil //["Function": "authenticate", "File": "Auth.swift"]    
attributes + moreAttributes //["Function": "authenticate", "File": "Auth.swift"]
attributes + nil //["File": "Auth.swift"]

Yg mungkin berubah

// Swift 2
func += <K,V> (inout left: Dictionary<K,V>, right: Dictionary<K,V>?) {
    guard let right = right else { return }
    right.forEach { key, value in
        left.updateValue(value, forKey: key)
    }
}

let moreAttributes: [String:AnyObject] = ["Function":"authenticate"]
var attributes: [String:AnyObject] = ["File":"Auth.swift"]

attributes += nil //["File": "Auth.swift"]
attributes += moreAttributes //["File": "Auth.swift", "Function": "authenticate"]
ricardopereira
sumber
5
Saya tidak mengerti mengapa ini tidak dibangun menjadi cepat secara default?
ioquatix
1
apakah Anda bermaksud nilai dari kiri untuk menimpa kanan dalam solusi "Tidak Berubah" Anda? Saya pikir Anda bermaksud memiliki 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]
ccwasden
Output sesuai dengan kode. Saya ingin nilai awal menjadi sisi kanan, seperti sekarang.
ricardopereira
12

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

  var oldDictionary = ["a": 1, "b": 2]
  var newDictionary = ["a": 10000, "b": 10000, "c": 4]

  oldDictionary.merge(newDictionary) { (oldValue, newValue) -> Int in
        // This closure return what value to consider if repeated keys are found
        return newValue 
  }
  print(oldDictionary) // Prints ["b": 10000, "a": 10000, "c": 4]
Vinayak Parmar
sumber
2
Saya menambahkan gaya fungsional untuk contoh di atas:oldDictionary.merge(newDictionary) { $1 }
Andrej
11

Varian yang lebih mudah dibaca menggunakan ekstensi.

extension Dictionary {    
    func merge(dict: Dictionary<Key,Value>) -> Dictionary<Key,Value> {
        var mutableCopy = self        
        for (key, value) in dict {
            // If both dictionaries have a value for same key, the value of the other dictionary is used.           
            mutableCopy[key] = value 
        }        
        return mutableCopy
    }    
}
orkoden
sumber
3
solusi yang sangat bagus dan bersih!
user3441734
11

Anda bisa mencoba ini

var dict1 = ["a" : "foo"]
var dict2 = ["b" : "bar"]

var temp = NSMutableDictionary(dictionary: dict1);
temp.addEntriesFromDictionary(dict2)
Uttam Kumar
sumber
10

Anda juga dapat menggunakan pengurangan untuk menggabungkannya. Coba ini di taman bermain

let d1 = ["a":"foo","b":"bar"]
let d2 = ["c":"car","d":"door"]

let d3 = d1.reduce(d2) { (var d, p) in
   d[p.0] = p.1
   return d
}
farhadf
sumber
Ini terlihat menarik, tetapi apa ddan p?
merampok
1
d adalah hasil yang bertahan dari setiap iterasi dari blok reduksi dan p adalah elemen dari koleksi yang sedang dikurangi.
farhadf
1
ini tampaknya crash dalam beta 3.0 cepat
possen
parameter var tidak digunakan lagi dalam 3
Dmitry Klochkov
Ini adalah solusi favorit saya dari yang disebutkan di sini. Saring / petakan / kurangi kemenangan lagi untuk solusi ringkas yang hebat
gokeji
7

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+

public extension Dictionary {
    public static func +=(lhs: inout [Key: Value], rhs: [Key: Value]) {
        rhs.forEach({ lhs[$0] = $1})
    }
}
Justin Oroz
sumber
Sebenarnya, SE-110 telah dikembalikan, sehingga versi Swift 4 harus sama dengan versi Swift 3.
BallpointBen
5

Anda dapat mengulangi kombinasi Nilai Kunci dengan nilai yang ingin Anda gabungkan dan menambahkannya melalui metode updateValue (forKey :):

dictionaryTwo.forEach {
    dictionaryOne.updateValue($1, forKey: $0)
}

Sekarang semua nilai dictionaryTwo ditambahkan ke dictionaryOne.

LeonS
sumber
4

Sama dengan jawaban @ farhadf tetapi diadopsi untuk Swift 3:

let sourceDict1 = [1: "one", 2: "two"]
let sourceDict2 = [3: "three", 4: "four"]

let result = sourceDict1.reduce(sourceDict2) { (partialResult , pair) in
    var partialResult = partialResult //without this line we could not modify the dictionary
    partialResult[pair.0] = pair.1
    return partialResult
}
Dmitry Klochkov
sumber
4

Swift 3, ekstensi kamus:

public extension Dictionary {

    public static func +=(lhs: inout Dictionary, rhs: Dictionary) {
        for (k, v) in rhs {
            lhs[k] = v
        }
    }

}
aaannjjaa
sumber
4

Beberapa kelebihan beban yang lebih ramping untuk Swift 4:

extension Dictionary {
    static func += (lhs: inout [Key:Value], rhs: [Key:Value]) {
        lhs.merge(rhs){$1}
    }
    static func + (lhs: [Key:Value], rhs: [Key:Value]) -> [Key:Value] {
        return lhs.merging(rhs){$1}
    }
}
John Montgomery
sumber
3

Anda dapat menambahkan Dictionaryekstensi seperti ini:

extension Dictionary {
    func mergedWith(otherDictionary: [Key: Value]) -> [Key: Value] {
        var mergedDict: [Key: Value] = [:]
        [self, otherDictionary].forEach { dict in
            for (key, value) in dict {
                mergedDict[key] = value
            }
        }
        return mergedDict
    }
}

Kemudian penggunaan adalah sebagai sederhana sebagai berikut:

var dict1 = ["a" : "foo"]
var dict2 = ["b" : "bar"]

var combinedDict = dict1.mergedWith(dict2)
// => ["a": "foo", "b": "bar"]

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.

Astaga
sumber
Menginstal perpustakaan untuk menggunakan fungsi tunggal adalah praktik yang buruk
HackaZach
@HackaZach: Saya baru saja memperbarui jawaban saya untuk memasukkan bagian yang sesuai dari kerangka kerja untuk mencegah masuknya seluruh perpustakaan jika hanya bagian kecil ini diperlukan. Saya menyimpan petunjuk untuk kerangka kerja bagi orang-orang yang ingin menggunakan banyak fitur itu. Saya harap ini membantu menjaga praktik yang baik!
Jeehut
3

Tidak perlu ekstensi atau fungsi tambahan lagi. Anda bisa menulis seperti itu:

firstDictionary.merge(secondDictionary) { (value1, value2) -> AnyObject in
        return object2 // what you want to return if keys same.
    }
Burak Dizlek
sumber
2

Kamu bisa memakai,

func addAll(from: [String: Any], into: [String: Any]){
    from.forEach {into[$0] = $1}
}
Sazzad Hissain Khan
sumber
1

Anda dapat menggunakan fungsi bridgeToObjectiveC () untuk membuat kamus menjadi NSDictionary.

Akan seperti berikut ini:

var dict1 = ["a":"Foo"]
var dict2 = ["b":"Boo"]

var combinedDict = dict1.bridgeToObjectiveC()
var mutiDict1 : NSMutableDictionary! = combinedDict.mutableCopy() as NSMutableDictionary

var combineDict2 = dict2.bridgeToObjectiveC()

var combine = mutiDict1.addEntriesFromDictionary(combineDict2)

Kemudian Anda dapat mengkonversi kembali NSDictionary (menggabungkan) atau melakukan apa pun.

Anton
sumber
Maaf apa maksud Anda sebenarnya?
Anton
Hanya preferensi. Tampaknya berbelit-belit untuk menjembatani antar bahasa. Lebih baik tetap dalam batas-batas bahasa tunggal, sementara secara bersamaan membiarkan objek-c mati lebih cepat.
TruMan1
2
Ya, saya memposting jawaban ini secara harfiah pada hari Swift diumumkan ....... Jadi ada alasannya
Anton
1
import Foundation

let x = ["a":1]
let y = ["b":2]

let out = NSMutableDictionary(dictionary: x)
out.addEntriesFromDictionary(y)

Hasilnya adalah NSMutableDictionary bukan kamus yang diketik Swift, tetapi sintaks untuk menggunakannya adalah sama ( out["a"] == 1dalam 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:

let x = ["a":1]
let y = ["b":2]

var out = x
for (k, v) in y {
    out[k] = v
}

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.

Jim Driscoll
sumber
1

Semua tanggapan ini rumit. Ini solusi saya untuk Swift 2.2:

    //get first dictionnary
    let finalDictionnary : NSMutableDictionary = self.getBasicDict()
    //cast second dictionnary as [NSObject : AnyObject]
    let secondDictionnary : [NSObject : AnyObject] = self.getOtherDict() as [NSObject : AnyObject]
    //merge dictionnary into the first one
    finalDictionnary.addEntriesFromDictionary(secondDictionnary) 
Kevin ABRIOUX
sumber
Sayangnya ini hanya berfungsi pada NSMutableDictionary dan bukan kamus Swift asli. Saya berharap ini akan ditambahkan ke Swift secara asli.
Chris Paveglio
0

Kebutuhan saya berbeda, saya perlu menggabungkan set data bersarang tidak lengkap tanpa clobbering.

merging:
    ["b": [1, 2], "s": Set([5, 6]), "a": 1, "d": ["x": 2]]
with
    ["b": [3, 4], "s": Set([6, 7]), "a": 2, "d": ["y": 4]]
yields:
    ["b": [1, 2, 3, 4], "s": Set([5, 6, 7]), "a": 2, "d": ["y": 4, "x": 2]]

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.

import UIKit


private protocol Mergable {
    func mergeWithSame<T>(right: T) -> T?
}



public extension Dictionary {

    /**
    Merge Dictionaries

    - Parameter left: Dictionary to update
    - Parameter right:  Source dictionary with values to be merged

    - Returns: Merged dictionay
    */


    func merge(right:Dictionary) -> Dictionary {
        var merged = self
        for (k, rv) in right {

            // case of existing left value
            if let lv = self[k] {

                if let lv = lv as? Mergable where lv.dynamicType == rv.dynamicType {
                    let m = lv.mergeWithSame(rv)
                    merged[k] = m
                }

                else if lv is Mergable {
                    assert(false, "Expected common type for matching keys!")
                }

                else if !(lv is Mergable), let _ = lv as? NSArray {
                    assert(false, "Dictionary literals use incompatible Foundation Types")
                }

                else if !(lv is Mergable), let _ = lv as? NSDictionary {
                    assert(false, "Dictionary literals use incompatible Foundation Types")
                }

                else {
                    merged[k] = rv
                }
            }

                // case of no existing value
            else {
                merged[k] = rv
            }
        }

        return merged
    }
}




extension Array: Mergable {

    func mergeWithSame<T>(right: T) -> T? {

        if let right = right as? Array {
            return (self + right) as? T
        }

        assert(false)
        return nil
    }
}


extension Dictionary: Mergable {

    func mergeWithSame<T>(right: T) -> T? {

        if let right = right as? Dictionary {
            return self.merge(right) as? T
        }

        assert(false)
        return nil
    }
}


extension Set: Mergable {

    func mergeWithSame<T>(right: T) -> T? {

        if let right = right as? Set {
            return self.union(right) as? T
        }

        assert(false)
        return nil
    }
}



var dsa12 = Dictionary<String, Any>()
dsa12["a"] = 1
dsa12["b"] = [1, 2]
dsa12["s"] = Set([5, 6])
dsa12["d"] = ["c":5, "x": 2]


var dsa34 = Dictionary<String, Any>()
dsa34["a"] = 2
dsa34["b"] = [3, 4]
dsa34["s"] = Set([6, 7])
dsa34["d"] = ["c":-5, "y": 4]


//let dsa2 = ["a": 1, "b":a34]
let mdsa3 = dsa12.merge(dsa34)
print("merging:\n\t\(dsa12)\nwith\n\t\(dsa34) \nyields: \n\t\(mdsa3)")
Chris Conover
sumber
0

Cepat 2.2

func + <K,V>(left: [K : V], right: [K : V]) -> [K : V] {
    var result = [K:V]()

    for (key,value) in left {
        result[key] = value
    }

    for (key,value) in right {
        result[key] = value
    }
    return result
}
apinho
sumber
jika Anda meletakkan ini, Anda dapat menghapus lingkaran pertama: `var result = left`
NikeAlive
0

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

let dict: Dictionary<String, Int> = ["Dog": 1, "Cat": 2]
let dict2: Dictionary<String, Int> = ["Cow": 3]
let dict3: Dictionary<String, Int> = ["Sheep": 4]
$.merge(dict, dict2, dict3)
=> ["Dog": 1, "Cat": 2, "Cow": 3, "Sheep": 4]
Andy
sumber
5
jQuery kembali yay!
Ben Sinclair
0

Ini adalah ekstensi yang bagus yang saya tulis ...

extension Dictionary where Value: Any {
    public func mergeOnto(target: [Key: Value]?) -> [Key: Value] {
        guard let target = target else { return self }
        return self.merging(target) { current, _ in current }
    }
}

menggunakan:

var dict1 = ["cat": 5, "dog": 6]
var dict2 = ["dog": 9, "rodent": 10]

dict1 = dict1.mergeOnto(target: dict2)

Kemudian, dict1 akan dimodifikasi menjadi

["cat": 5, "dog": 6, "rodent": 10]
Brian J. Roberts
sumber