2016-11-02 4 views
1

私は彼らの両方がassociatedtypesを持って、2つのプロトコルを宣言する必要があります。この現在のプロトコルの定義では2つのプロトコル間で関連タイプを共有するにはどうすればよいですか?

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?) 
} 

MyViewassociatedtype DataTypeは本当にMyLayoutにおけるものと同じではありません。

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

コンパイラは型が同じではないことを私たちに伝えています。

問題を解決するために2つのプロトコル間で関連タイプを共有する方法はありますか?ありがとう。

+0

、おそらくあなたは、他の2 – Alexander

+0

@AlexanderMomchliovから継承プロトコルを作ることを意味 - 私はすでに(https://gist.github.com/anonymous/58fb6e95549081ba8eff9c7fc81d6fc2)それを試してみましたが、それが同じエラーで失敗します。 – MartinMoizard

答えて

2

MyViewの実装では、DataTypeと別のDataTypeを持つLayoutTypeがある可能性があるという問題があります。

associatedtype LayoutType : MyLayout where LayoutType.DataType == DataType 

を適合するタイプが一致DataTypeLayoutTypeを持たなければならないことを強制するために:SE-0142: Permit where clauses to constrain associated typesが実装されたら、あなただけ言うことができるでしょう。

が一致する場合は、doLayout()のデフォルトの実装のみが使用可能になります。このような状況が発生するまで、おそらくできることは、拡張機能に制約を追加することです。

extension MyView where LayoutType.DataType == DataType { 
    func doLayout() { 
     layout.computeLayout(with: data) 
    } 
} 
関連する問題