Swift给我们带来了许多新的能力,比如(终于!)可以连接字符串和数组。但是对于字典来说却没有支持。那么连接字典的唯一方法是为它们重载+操作符吗?
let string = "Hello" + "World" // "HelloWorld"
let array = ["Hello"] + ["World"] // ["Hello", "World"]
let dict = ["1" : "Hello"] + ["2" : "World"] // error =(
Swift给我们带来了许多新的能力,比如(终于!)可以连接字符串和数组。但是对于字典来说却没有支持。那么连接字典的唯一方法是为它们重载+操作符吗?
let string = "Hello" + "World" // "HelloWorld"
let array = ["Hello"] + ["World"] // ["Hello", "World"]
let dict = ["1" : "Hello"] + ["2" : "World"] // error =(
使用方法如下:
将此代码放置在任何位置,例如 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 =)
["1" : "Hello"] + ["2" : "World"]
或["2" : "World"] + ["1" : "Hello"]
都会得到相同的结果。 - Yuchen[1: 2, 2: 3] + [2: 4, 3: 5]
与[2: 4, 3: 5] + [1: 2, 2: 3]
。@YuchenZhong - Raphael+
)无论如何都不是可交换的。 - chan1142这是不可能的,因为第二个字典中可能会有匹配的键。但是您可以手动完成,并在这种情况下替换字典中的值。
var dict = ["1" : "Hello"]
let dict2 = ["2" : "World"]
for key in dict2.keys {
dict[key] = dict2[key]
}
public func +<K, V>(left: [K:V], right: [K:V]) -> [K:V] {
return left.merging(right) { $1 }
}
$1将从右侧字典中获取常见的键,如果你想要让左侧字典具有优先权,可以使用$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)
forEach
。事实上,几乎从来不需要使用 forEach
。它只会让你的代码看起来很丑陋。相反,应该使用 for 循环。 - Peter Schorn