Как ограничить расширение коллекции Swift типом generi c? - PullRequest
2 голосов
/ 01 марта 2020

Поскольку кортежи не могут быть хэшируемыми в Swift, я создал обобщенную c struct Couple, содержащую два элемента, которые вместе можно использовать в качестве ключа к словарю.

struct Couple<U: Hashable, V: Hashable>: Hashable {
    let u: U
    let v: V

    init( _ u: U, _ v: V ) {
        self.u = u
        self.v = v
    }
}
var dictionary: [ Couple<Int,Int> : Any ] = ...

Теперь я хотел бы нравится расширять словарь, используя пару в общем.

extension Dictionary where Key == Couple<U: Hashable, V: Hashable>, Value == Any {
    func exampleConvertToArray() -> [ ( U, V, Any ) ] {
    }
}

Компилятор жалуется, независимо от того, как я ссылаюсь на пару, U, V в выражении расширения. Если я вместо этого добавлю generi c к определению функции, компилятор также пожалуется.

Если типы не являются generi c (extension Dictionary where Key == Couple<Int, Int>, Value == Any), все в порядке.

Как я могу создать это расширение c generi?

1 Ответ

2 голосов
/ 01 марта 2020

Это возможно, но, к сожалению, общие ограничения c должны быть выражены для самих членов, а не для всего extension:

struct Couple<U: Hashable, V: Hashable>: Hashable {
    let u: U
    let v: V

    init( _ u: U, _ v: V ) {
        self.u = u
        self.v = v
    }
}

extension Dictionary {
    func exampleConvertToArray<U, V>() -> [(U, V, Any)] where Key == Couple<U, V> {
        self.map { (key, value) in (key.u, key.v, value) }
    }
}

let input = [
    Couple(1, 2): 3,
    Couple(4, 5): 6,
    Couple(7, 8): 9,
]

let result = input.exampleConvertToArray()
print(result)
...