如何使用+ =运算符重载连接两个字典

时间:2017-07-19 18:37:41

标签: swift dictionary operator-overloading

我想使用下面的方法连接两个带有+ =运算符重载的字典。

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;)

它不起作用,任何人都可以帮助我,或者如果不可能,请解释我为什么?

2 个答案:

答案 0 :(得分:9)

Swift 4个替代品

由于Swift 4即将来临,我将添加一个答案(解决,特别是问题或标题),包括其发布时可用的其他方法。

进化提案

在Swift 4中实现,允许您使用变异merge(_:uniquingKeysWith:)(或非变异merging(_:uniquingKeysWith:))等方法组合两个词典,这也允许您指定如何解决关键冲突。

,使用<xsl:template match="SDTInInfoExtra"> <Characteristic name="{Name}" value="{Value}"/> </xsl:template> 实现+=函数,用现有的键值(碰撞时)覆盖右侧字典中的相关值:

merge(_:uniquingKeysWith:)

答案 1 :(得分:5)

假设您在Dictionary扩展程序中定义此重载,请不要引入KeyValue个通用占位符;使用已由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
        }
    }
}