我想使用下面的方法连接两个带有+ =运算符重载的字典。
static func += <Key, Value> ( left: inout [Key : Value], right: [Key : Value]) {
for (key, value) in right {
left.updateValue(value, forKey: key)
}
}
OR
static func +=<Key, Value>( left: inout Dictionary<Key ,Value>, right: Dictionary<Key, Value>) {
for (key, value) in right {
left.updateValue(value, forKey: key)
}
}
有了这个实现:
var properties = ["Key": "Value"]
var newProperties = ["NewKey": "NewValue"]
properties += newProperties
我从xCode得到以下错误,
无法转换类型&#39; [字符串:任意]&#39;的值预期的参数类型 &#39; inout [_:]&#39; (又名&#39; inout&#39;字典&lt; ,_&gt;)
它不起作用,任何人都可以帮助我,或者如果不可能,请解释我为什么?
答案 0 :(得分:9)
由于Swift 4即将来临,我将添加一个答案(解决,特别是问题或标题),包括其发布时可用的其他方法。
进化提案
在Swift 4中实现,允许您使用变异merge(_:uniquingKeysWith:)
(或非变异merging(_:uniquingKeysWith:)
)等方法组合两个词典,这也允许您指定如何解决关键冲突。
,使用<xsl:template match="SDTInInfoExtra">
<Characteristic name="{Name}" value="{Value}"/>
</xsl:template>
实现+=
函数,用现有的键值(碰撞时)覆盖右侧字典中的相关值:
merge(_:uniquingKeysWith:)
答案 1 :(得分:5)
假设您在Dictionary
扩展程序中定义此重载,请不要引入Key
和Value
个通用占位符;使用已由Dictionary
定义的通用占位符(因为您自己介绍的那些与它们完全无关):
extension Dictionary {
static func += (left: inout [Key: Value], right: [Key: Value]) {
for (key, value) in right {
left[key] = value
}
}
}
var properties = ["Key": "Value"]
let newProperties = ["NewKey": "NewValue"]
properties += newProperties
print(properties) // ["NewKey": "NewValue", "Key": "Value"]
您还可以通过Dictionary
个操作数{/ 3>来let Swift infer this
extension Dictionary {
static func += (left: inout Dictionary, right: Dictionary) {
for (key, value) in right {
left[key] = value
}
}
}