2017-02-08 3 views
0

Мы имеем вспомогательную функцию, которая, как это: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. Однако с ошибкой не работает

«Двоичный оператор + нельзя применить к [Строка: Строка] и [Строка: 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 
} 
+0

использования 3 родовое параметры: один для левого типа, один для правильного типа, с ограничением, что левое и правое являются подклассом третьего – Alexander

ответ

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 
} 
Смежные вопросы