How to combine two Dictionary instances in Swift?
I love this approach:
dicFrom.forEach { (key, value) in dicTo[key] = value }
Swift 4 and 5
With Swift 4 Apple introduces a better approach to merge two dictionaries:
let dictionary = ["a": 1, "b": 2]let newKeyValues = ["a": 3, "b": 4]let keepingCurrent = dictionary.merging(newKeyValues) { (current, _) in current }// ["b": 2, "a": 1]let replacingCurrent = dictionary.merging(newKeyValues) { (_, new) in new }// ["b": 4, "a": 3]
You have 2 options here (as with most functions operating on containers):
merge
mutates an existing dictionarymerging
returns a new dictionary
var d1 = ["a": "b"]var d2 = ["c": "e"]extension Dictionary { mutating func merge(dict: [Key: Value]){ for (k, v) in dict { updateValue(v, forKey: k) } }}d1.merge(d2)
Refer to the awesome Dollar & Cent project https://github.com/ankurp/Cent/blob/master/Sources/Dictionary.swift
For Swift >= 2.2:let parameters = dict1.reduce(dict2) { r, e in var r = r; r[e.0] = e.1; return r }
For Swift < 2.2:let parameters = dict1.reduce(dict2) { (var r, e) in r[e.0] = e.1; return r }
Swift 4 has a new function:let parameters = dict1.reduce(into: dict2) { (r, e) in r[e.0] = e.1 }
It's really important to dig around the standard library: map
, reduce
, dropFirst
, forEach
etc. are staples of terse code. The functional bits are fun!