在Swift中合并两个字典

8

Swift给我们带来了许多新的能力,比如(终于!)可以连接字符串和数组。但是对于字典来说却没有支持。那么连接字典的唯一方法是为它们重载+操作符吗?

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

请查看此链接,可能会对您有所帮助:https://dev59.com/aYzda4cB1Zd3GeqPiyyy - Anbu.Karthik
2
请查看以下链接:https://dev59.com/ZGAg5IYBdhLWcg3wBXER - Bhavin Bhadani
4个回答

18

使用方法如下:

  1. 将此代码放置在任何位置,例如 Dictionary+Extension.swift 文件中:

     func +<Key, Value> (lhs: [Key: Value], rhs: [Key: Value]) -> [Key: Value] {
         var result = lhs
         rhs.forEach{ result[$0] = $1 }
         return result
     }
    
    现在你的代码就能正常工作了。
     let string = "Hello" + "World" // "HelloWorld"
     let array = ["Hello"] + ["World"] // ["Hello", "World"]
     let dict = ["1" : "Hello"] + ["2" : "World"] // okay =)
    

“+”不是一个好选择:通常它是一个可交换的运算符,而这个并不是。 - Raphael
嘿@Raphael,为什么它不是可交换的?给定两个字典,使用["1" : "Hello"] + ["2" : "World"]["2" : "World"] + ["1" : "Hello"]都会得到相同的结果。 - Yuchen
1
考虑冲突键的情况:[1: 2, 2: 3] + [2: 4, 3: 5][2: 4, 3: 5] + [1: 2, 2: 3]。@YuchenZhong - Raphael
嗯,@Raphael,你说得很好!耶,在这种情况下,“+”有点误导。 - Yuchen
2
字符串连接(+)无论如何都不是可交换的。 - chan1142
显示剩余2条评论

12

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

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

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

4
您也可以使用Swift提供的函数来进行合并:
public func +<K, V>(left: [K:V], right: [K:V]) -> [K:V] {
    return left.merging(right) { $1 }
}

$1将从右侧字典中获取常见的键,如果你想要让左侧字典具有优先权,可以使用$0。


0

可以使用for each循环和inout关键字来完成此操作

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

那么调用就像这样

mergDict(firstDict: &firstDictToMerge, secondDict: secondDictToMerge)

你会发现,你的 firstDictToMerge 将与第二个字典合并,而不使用任何其他变量。

不需要使用 forEach。事实上,几乎从来不需要使用 forEach。它只会让你的代码看起来很丑陋。相反,应该使用 for 循环。 - Peter Schorn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接