Как расширить тип, который принимает общие элементы массива?

У меня есть тип, который я пытаюсь специально расширить: AnyObserver<[MyModel]>. Было бы легко расширить, если бы я не передавал массив как Element, что я могу сделать примерно так:

extension AnyObserver where Element: MyModel {...}

Однако на самом деле Element — это массив, поэтому я попытался сделать что-то вроде одного из следующих:

extension AnyObserver where Element: Array<MyModel> {...}
extension AnyObserver where Element: Array<T: MyModel> {...}
extension AnyObserver where Element == Array<MyModel> {...}
extension AnyObserver where Element == [MyModel] {...}

Это приводит к ошибкам компиляции, таким как:

Same-type requirement makes generic parameter non-generic
Type 'Element' constrained to non-protocol type

Как правильно создать расширение для этого случая?


person TruMan1    schedule 23.07.2016    source источник


Ответы (1)


Как правило, вы не можете расширить универсальный тип на основе определенного параметра типа. Вы можете продлить только на основе протокола. Но в вашем конкретном случае это дает нам выход. Просто не требуйте массива. Требовать тип коллекции.

extension AnyObserver
    where Element: CollectionType, Element.Generator.Element == MyModel {
}
person Rob Napier    schedule 23.07.2016