Làm thế nào để bạn thêm một từ điển của các mục vào một từ điển khác


172

Mảng trong Swift hỗ trợ toán tử + = để thêm nội dung của một mảng này vào một mảng khác. Có một cách dễ dàng để làm điều đó cho một từ điển?

ví dụ:

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

var combinedDict = ... (some way of combining dict1 & dict2 without looping)


fromDict.forEach {intoDict[$0] = $1}
Sazzad Hissain Khan

Câu trả lời:


171

Bạn có thể định nghĩa +=toán tử cho Dictionary, vd

func += <K, V> (left: inout [K:V], right: [K:V]) { 
    for (k, v) in right { 
        left[k] = v
    } 
}

1
Ôi trời, tôi đã vật lộn rất nhiều với việc tìm ra tuyên bố chung chung cho việc này, tôi đã thử mọi cách trừ việc này. Nhưng bạn có thể bỏ @assignmentreturn, bạn đã biến đổi sang trái. Chỉnh sửa: thực sự, mặc dù tôi không có lỗi, tôi nghĩ @assignmentnên ở lại.
Roland

14
Thêm cú pháp đường: func +=<K, V> (inout left: [K : V], right: [K : V]) { for (k, v) in right { left[k] = v } }
Ivan Vavilov

48
@animal_chin Vì chúng tôi phải tự thực hiện một nửa ngôn ngữ? Đúng. Ấn tượng. Đừng hiểu lầm tôi yêu quá tải toán tử. Tôi chỉ không thích sử dụng nó cho các tính năng cơ bản nên được tích hợp.
devios1

2
@devios Haha sau đó biến nó thành yêu cầu kéo tới repo Swift: D Vì rõ ràng Apple không thể bị phạt
CommaToast

6
Kéo thẳng từ Thư viện SwifterSwift :public static func +=(lhs: inout [Key: Value], rhs: [Key: Value]) { rhs.forEach({ lhs[$0] = $1}) }
Justin Oroz

99

Trong Swift 4, người ta nên sử dụng merging(_:uniquingKeysWith:):

Thí dụ:

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]

1
// mutable: var dictA = ["x": 1, "y": 2, "z": 3] var dictB = ["x": 11, "y": 22, "w": 0] dictA. hợp nhất (dictB, uniquingKeysWith: {(đầu tiên, _) trong đầu tiên}) print (dictA) // ["x": 1, "y": 2, "z": 3, "w": 0]
muthukumar

1
Ví dụ thứ hai thể hiện trong câu trả lời này là tương đương với [NSMutableDictionary addEntriesFromDictionary:].
orj

92

Làm thế nào về

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

Điều đó thêm tất cả các khóa và giá trị của dict2 vào dict1.


43
Giải pháp tốt đẹp. Ngắn hơn một chút: dict2.forEach {dict1 [$ 0] = $ 1}
Brett

1
Đây là một giải pháp tuyệt vời, nhưng đối với Swift 4, rất có thể bạn sẽ gặp lỗi nêu rõ Closure tuple parameter '(key: _, value: _)' does not support destructuring(ít nhất là tại thời điểm viết bài này). Người ta sẽ cần cơ cấu lại việc đóng theo [câu trả lời stackoverflow này] ( stackoverflow.com/questions/44945967/iêu ):
JonnyB

78

Hiện tại, nhìn vào Tài liệu tham khảo thư viện tiêu chuẩn Swift cho từ điển, không có cách nào để dễ dàng cập nhật từ điển với từ điển khác.

Bạn có thể viết một phần mở rộng để làm điều đó

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]

3
Đây là một cách sử dụng tuyệt vời của phần mở rộng cho Từ điển!
Marc Attinasi

76

Swift 4 cung cấp merging(_:uniquingKeysWith:), vì vậy đối với trường hợp của bạn:

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

Việc đóng lại tốc ký đóng lại $1, do đó giá trị của dict2 sẽ được sử dụng khi có xung đột với các khóa.


1
Chỉ muốn chỉ ra rằng đây là điều ngắn gọn và gần gũi nhất mà tôi đã tìm thấy với những gì tài liệu của Apple nêu ra - (void)addEntriesFromDictionary:(NSDictionary<KeyType, ObjectType> *)otherDictionary;. Liên quan đến những gì cần làm với các mục trùng lặp, nó nói rằng: "Nếu cả hai từ điển đều chứa cùng một khóa, thì đối tượng giá trị trước đó của từ điển nhận cho khóa đó được gửi một thông báo phát hành và đối tượng giá trị mới sẽ thay thế." phiên bản Swift hoặc hợp nhất (_: uniquingKeysWith :), trả về giá trị thứ hai, $1giống như những gì addEntriesFromDictionarynó làm.
Tim Fuqua

31

Nó không được tích hợp vào thư viện Swift nhưng bạn có thể thêm những gì bạn muốn với quá tải toán tử, vd:

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
}

Điều này làm quá tải +toán tử cho Từ điển mà bây giờ bạn có thể sử dụng để thêm từ điển với +toán tử, ví dụ:

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

var dict3 = dict1 + dict2 // ["a": "foo", "b": "bar"]

1
Bạn cũng có thể làm điều đó cho + = để cập nhật tại chỗ một câu lệnh (theo câu hỏi op).
Rod

3
Bạn có thể loại bỏ mapvà bỏ for (k, v)...vòng lặp đầu tiên nếu bạn khai báo lefttham số là varvà sau đó chỉ cần sao chép các giá trị từ rightđó.
Nate Cook

2
@NateCook sẽ làm thay đổi Từ điển không phải là hành vi được mong đợi cho +toán tử infix.
huyền thoại

Cảm ơn vì điều đó. Câu trả lời của bạn có lẽ chính xác hơn với mã mẫu tôi đã đăng, trong khi một câu khác là những gì tôi muốn dựa trên câu hỏi của tôi. Xấu của tôi, dù sao cũng đã cho bạn cả một upvote;)
rustyshelf

2
@mythz Nó không thực sự gây đột biến, vì +quá tải toán tử không phải là một phương thức Dictionary, đó là một chức năng đơn giản. Những thay đổi bạn thực hiện đối với lefttham số biến sẽ không hiển thị bên ngoài hàm.
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"]

6
tốt hơn một chútfunc 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
    }
}

không thể gọi hàm đột biến từ hàm không biến đổi như thế
njzk2

Các unionchức năng có giá trị truyền vào đó là một var, có nghĩa là từ điển sao chép có thể được biến đổi. Nó sạch hơn một chút func union(dictionary: Dictionary) -> Dictionary { var dict2 = dictionary; dict2.unionInPlace(self); return dict2 }, nếu chỉ bằng một dòng.
MaddTheSane

2
thông số var không được dùng nữa và sẽ bị xóa trong Swift 3. Cách thức ưa thích hiện nay là khai báo var trong phần thân : var dictionary = dictionary. Từ đây: github.com/apple/swift-evolution/blob/master/proposeals/iêu
Daniel Wood

Để làm cho mọi thứ an toàn hơn, hãy thêm <Key, Value>vào những Dictionarys.
Raphael

12

Bất biến

Tôi thích kết hợp / hợp nhất các từ điển bất biến với +toán tử vì vậy tôi đã triển khai nó như sau:

// 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"]

Có thể thay đổi

// 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"]

5
Tôi không hiểu tại sao điều này không được tích hợp vào swift theo mặc định?
ioquatix 14/2/2016

1
bạn có ý định giá trị từ trái sang ghi đè bên phải trong giải pháp "Bất biến" của bạn không? Tôi nghĩ bạn muốn có right.reduce(left), ít nhất đó là hành vi dự kiến ​​imo (và đó là hành vi của ví dụ thứ hai của bạn) - tức là. ["A":1] + ["A":2]nên xuất["A":2]
ccwasden

Đầu ra tương ứng với mã. Tôi muốn giá trị ban đầu là bên phải, giống như nó là ngay bây giờ.
ricardopereira

12

Không cần phải có bất kỳ phần mở rộng từ điển bây giờ. Từ điển Swift (Xcode 9.0+) đã có chức năng cho việc này. Có một cái nhìn ở đây . Dưới đây là một ví dụ về cách sử dụng nó

  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]

2
Tôi đang thêm một kiểu chức năng cho ví dụ trên:oldDictionary.merge(newDictionary) { $1 }
Andrej

11

Một biến thể dễ đọc hơn bằng cách sử dụng một phần mở rộng.

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
    }    
}

3
giải pháp rất đẹp và sạch sẽ!
user3441734

11

Bạn có thể thử cái này

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

var temp = NSMutableDictionary(dictionary: dict1);
temp.addEntriesFromDictionary(dict2)

10

Bạn cũng có thể sử dụng giảm để hợp nhất chúng. Hãy thử điều này trong sân chơi

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
}

Điều này có vẻ thú vị, nhưng những gì dp?
cướp

1
d là kết quả bền bỉ của mỗi lần lặp của khối giảm và p là phần tử của tập hợp đang bị giảm.
farhadf

1
điều này dường như sụp đổ trong swift 3.0 beta
sở hữu

tham số var không được dùng trong swift 3
Dmitry Klochkov

Đây là giải pháp yêu thích của tôi trong số những người được đề cập ở đây. Lọc / bản đồ / giảm chiến thắng một lần nữa cho các giải pháp ngắn gọn tuyệt vời.
gokeji

7

Tôi khuyên dùng Thư viện SwifterSwift . Tuy nhiên, nếu bạn không muốn sử dụng toàn bộ thư viện và tất cả các bổ sung tuyệt vời của nó, bạn chỉ có thể sử dụng phần mở rộng Từ điển của họ:

Swift 3+

public extension Dictionary {
    public static func +=(lhs: inout [Key: Value], rhs: [Key: Value]) {
        rhs.forEach({ lhs[$0] = $1})
    }
}

Trên thực tế, SE-110 đã được hoàn nguyên, vì vậy phiên bản Swift 4 phải giống với phiên bản Swift 3.
BallpointBen

5

Bạn có thể lặp lại các kết hợp Giá trị khóa tuân theo giá trị bạn muốn hợp nhất và thêm chúng thông qua phương thức updateValue (forKey :):

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

Bây giờ tất cả các giá trị của dictionaryTwo đã được thêm vào dictionaryOne.


4

Giống như câu trả lời của @ farhadf nhưng được áp dụng cho 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
}

4

Swift 3, mở rộng từ điển:

public extension Dictionary {

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

}

4

Một số tình trạng quá tải được sắp xếp hợp lý hơn cho 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}
    }
}

3

Bạn có thể thêm một Dictionarytiện ích mở rộng như thế này:

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
    }
}

Sau đó sử dụng là như đơn giản như sau:

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

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

Nếu bạn thích một khung công tác cũng bao gồm một số tính năng tiện dụng hơn thì hãy kiểm tra HandySwift . Chỉ cần nhập nó vào dự án của bạn và bạn có thể sử dụng mã trên mà không cần thêm bất kỳ tiện ích mở rộng nào cho dự án.


Cài đặt thư viện để sử dụng một chức năng duy nhất là một thực tiễn tồi
HackaZach

@HackaZach: Tôi vừa cập nhật câu trả lời của mình để bao gồm phần thích hợp của khung để ngăn chặn việc bao gồm toàn bộ thư viện nếu chỉ cần phần nhỏ này. Tôi đang giữ gợi ý cho khung cho những người muốn sử dụng nhiều tính năng của nó. Tôi hy vọng điều này sẽ giúp duy trì thực hành tốt!
Jeehut

3

Không cần gia hạn hoặc bất kỳ func thêm nữa. Bạn có thể viết như thế:

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

2

Bạn có thể dùng,

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

1

Bạn có thể sử dụng hàm BridgeToObjectiveC () để biến từ điển thành NSDipedia.

Sẽ như sau:

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)

Sau đó, bạn có thể chuyển đổi NSDipedia (kết hợp) trở lại hoặc làm bất cứ điều gì.


Xin lỗi chính xác là gì?
Anton

Chỉ là một sở thích. Có vẻ phức tạp để cầu nối giữa các ngôn ngữ. Tốt hơn là nên gắn bó trong giới hạn của một ngôn ngữ, đồng thời để obj-c chết nhanh hơn.
TruMan1

2
Vâng, tôi đã đăng câu trả lời này theo đúng nghĩa đen vào ngày Swift công bố ....... Vì vậy, có một lý do
Anton

1
import Foundation

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

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

Kết quả là một NSMutableDixi không phải là một từ điển gõ Swift, nhưng cú pháp để sử dụng nó là như nhau (out["a"] == 1 trong trường hợp này) nên bạn chỉ gặp vấn đề nếu bạn đang sử dụng mã của bên thứ ba mong đợi từ điển Swift hoặc thực sự cần kiểm tra loại.

Câu trả lời ngắn ở đây là bạn thực sự phải lặp lại. Ngay cả khi bạn không nhập nó một cách rõ ràng, đó là những gì phương thức bạn đang gọi (addEntriesFromDipedia: tại đây) sẽ làm. Tôi đề nghị nếu bạn không rõ một chút về lý do tại sao đó là trường hợp bạn nên xem xét cách bạn sẽ hợp nhất các nút lá của hai cây B.

Nếu bạn thực sự cần một loại từ điển gốc Swift, tôi sẽ đề xuất:

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

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

Nhược điểm của phương pháp này là chỉ mục từ điển - tuy nhiên đã được thực hiện - có thể được xây dựng lại nhiều lần trong vòng lặp, vì vậy trong thực tế, điều này chậm hơn khoảng 10 lần so với cách tiếp cận NSMutableDixi.


1

Tất cả những phản ứng này đều phức tạp. Đây là giải pháp của tôi cho 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) 

Điều này chỉ hoạt động trên NSMutableDixi và không phải từ điển Swift bản địa. Tôi ước điều này sẽ được thêm vào Swift nguyên bản.
Chris Paveglio

0

Nhu cầu của tôi là khác nhau, tôi cần hợp nhất các tập dữ liệu lồng nhau không hoàn chỉnh mà không bị ghi đè.

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]]

Điều này khó hơn tôi muốn. Thách thức là trong việc ánh xạ từ gõ động đến gõ tĩnh và tôi đã sử dụng các giao thức để giải quyết vấn đề này.

Cũng đáng lưu ý là khi bạn sử dụng cú pháp theo nghĩa đen của từ điển, bạn thực sự có được các loại nền tảng, không nhận các phần mở rộng giao thức. Tôi đã hủy bỏ những nỗ lực của mình để hỗ trợ những người đó vì tôi không thể tìm thấy một cách dễ dàng để xác nhận tính đồng nhất của các yếu tố bộ sưu tập.

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)")

0

Swift 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
}

nếu bạn đặt cái này, bạn có thể xóa vòng lặp đầu tiên: `var result = left`
NikeAlive

0

Tôi sẽ chỉ sử dụng thư viện Dollar .

https://github.com/ankurp/Dollar/#merge---merge-1

Hợp nhất tất cả các từ điển lại với nhau và từ điển sau ghi đè giá trị tại một khóa đã cho

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]

5
jQuery đã trở lại!
Ben Sinclair

0

Đây là một phần mở rộng tốt đẹp tôi đã viết ...

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 }
    }
}

sử dụng:

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

dict1 = dict1.mergeOnto(target: dict2)

Sau đó, dict1 sẽ được sửa đổi thành

["cat": 5, "dog": 6, "rodent": 10]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.