在Swift中连接两个词典

时间:2015-10-15 12:48:27

标签: swift dictionary concatenation

Swift为我们提供了很多新功能,比如(最后!)连接字符串甚至是数组。但不支持词典。连接字典的唯一方法是为它们重载+操作吗?

let string = "Hello" + "World" // "HelloWorld"
let array = ["Hello"] + ["World"] // ["Hello", "World"]
let dict = ["1" : "Hello"] + ["2" : "World"] // error =(

4 个答案:

答案 0 :(得分:15)

像这样使用:

  1. 把它放在任何地方,例如字典+ Extension.swift

    func +<Key, Value> (lhs: [Key: Value], rhs: [Key: Value]) -> [Key: Value] {
        var result = lhs
        rhs.forEach{ result[$0] = $1 }
        return result
    }
    
  2. 现在你的代码正常工作

    let string = "Hello" + "World" // "HelloWorld"
    let array = ["Hello"] + ["World"] // ["Hello", "World"]
    let dict = ["1" : "Hello"] + ["2" : "World"] // okay =)
    
  3. 编辑:

    正如@Raphael所建议的,+符号意味着计算是可交换的。请注意,事实并非如此。例如[2: 3] + [2: 4] vs [2: 4] + [2: 3]的结果不一样。

答案 1 :(得分:10)

这是不可能的,因为第二个字典中可能存在匹配的键。但是你可以手动完成,在这种情况下,字典中的值将被替换。

var dict = ["1" : "Hello"]
let dict2 = ["2" : "World"]

for key in dict2.keys {
    dict[key] = dict2[key]
}

答案 2 :(得分:0)

您也可以使用Swift提供的函数进行合并:

public func +<K, V>(left: [K:V], right: [K:V]) -> [K:V] {
    return left.merging(right) { $1 }
}

$ 1将从正确的字典中获取常用密钥,如果要优先使用左字典,则可以使用$ 0。

答案 3 :(得分:0)

这可以通过为每个循环和inout关键字使用

来完成
unordered

比打电话

func mergDict(firstDict:inout [String:Any],  secondDict:[String:Any]){
    secondDict.forEach { (key, value) in
        firstDict[key] = value
    }
}

您将看到您的firstDictToMerge将与第二个合并,而无需使用任何其他变量