Swift为我们提供了很多新功能,比如(最后!)连接字符串甚至是数组。但不支持词典。连接字典的唯一方法是为它们重载+操作吗?
let string = "Hello" + "World" // "HelloWorld"
let array = ["Hello"] + ["World"] // ["Hello", "World"]
let dict = ["1" : "Hello"] + ["2" : "World"] // error =(
答案 0 :(得分:15)
像这样使用:
把它放在任何地方,例如字典+ 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所建议的,+
符号意味着计算是可交换的。请注意,事实并非如此。例如[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将与第二个合并,而无需使用任何其他变量