Swift类型约束公共基类

时间:2017-02-08 03:23:57

标签: swift

我们有一个这样的辅助函数:

func + <KeyType, ValueType>(left: [KeyType: ValueType], right: [KeyType: ValueType])
    -> [KeyType: ValueType]
{
    var map: [KeyType: ValueType] = [:]
    for (key, value) in left {
        map[key] = value
    }
    for (key, value) in right {
        map[key] = value
    }
    return map
}

我们用它来轻松地组合两个词典:

let foo = ["fooKey" : "fooValue"]
let bar = ["barKey" : "barValue"]
let combine = foo + bar // ["fooKey": "fooValue", "barKey": "barValue"]

它很有效,因为"fooValue""barValue"都属于String类型。但是,以下内容不适用于错误

  

“二进制运算符+不能应用于[String:String]和[String:Int]”。

let foo = ["fooKey" : "fooValue"]
let bar = ["barKey" : 1]
let combine = foo + bar // Error!!!

是否有办法编写字典辅助函数,以便在值的类型不匹配时,找到它们的父/基类并将其用作返回类型?

从概念上讲,这样的事情:

func + <KeyType, ValueType1:BaseValueType, ValueType2:BaseValueType>(left: [KeyType: ValueType1], right: [KeyType: ValueType2])
    -> [KeyType: BaseValueType] 
{
    var map: [KeyType: BaseValueType] = [:]
    for (key, value) in left {
        map[key] = value
    }
    for (key, value) in right {
        map[key] = value
    }
    return map
}

1 个答案:

答案 0 :(得分:0)

您可以在结构中使用所有Swift词典键/值必须符合的协议:

func combine(lhs: [AnyHashable: Any], rhs: [AnyHashable: Any]) -> [AnyHashable: Any] {
    var dictionary = Dictionary<AnyHashable,Any>()
    lhs.forEach {
        dictionary[$0.key] = $0.value
    }
    rhs.forEach {
        dictionary[$0.key] = $0.value
    }
    return dictionary
}