2016-11-02 3 views
1

мне нужно объявить два протокола, оба они имеют associatedtypes:Как передать связанный тип между двумя протоколами?

protocol MyView { 
    associatedtype DataType 
    associatedtype LayoutType : MyLayout 

    var data: DataType { get } 
    var layout: LayoutType { get } 

    func doLayout() 
} 

protocol MyLayout { 
    associatedtype DataType 

    func computeLayout(with data: DataType?) 
} 

С этим текущим определением протокола, то associatedtype DataType из MyView не совсем такой же, как тот, в MyLayout:

extension MyView { 
    func doLayout() { 
    layout.computeLayout(with: self.data) 
           ^^^^^^^^^ 
    Cannot convert value of type 'Self.DataType' to expected argument type '_?' 
    } 
} 

компилятор говорит нам, что тип не тот.

Есть ли способ поделиться связанным типом между двумя протоколами, чтобы исправить мою проблему? Благодарю.

+0

возможно вы имеете в виду, чтобы сделать протокол, который наследуется от другого 2 – Alexander

+0

@AlexanderMomchliov - Я уже пробовал его (https://gist.github.com/anonymous/58fb6e95549081ba8eff9c7fc81d6fc2) и он терпит неудачу с такой же ошибкой. – MartinMoizard

ответ

2

Проблема заключается в том, что это возможно для реализации MyView, чтобы иметь LayoutType с другим DataType его собственному DataType. После SE-0142: Permit where clauses to constrain associated types реализован, вы будете просто быть в состоянии сказать:

associatedtype LayoutType : MyLayout where LayoutType.DataType == DataType 

для обеспечения выполнения, что соответствующие типы должны иметь LayoutType с соответствующим DataType.

Однако, до тех пор, пока это не произойдет, самое лучшее, что вы, вероятно, сможете сделать, это добавить ограничение к расширению - это приведет только к реализации по умолчанию doLayout(), если соответствует DataType.

extension MyView where LayoutType.DataType == DataType { 
    func doLayout() { 
     layout.computeLayout(with: data) 
    } 
} 
Смежные вопросы