2016-11-02 3 views
1

Ich brauche zwei Protokolle zu erklären, sie beide associatedtypes haben:Wie teilt man einen zugeordneten Typ zwischen zwei Protokollen?

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

Mit dieser aktuellen Protokolldefinition, die associatedtype DataType von MyView ist nicht wirklich das gleiche wie das in MyLayout:

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

Die Compiler sagt uns, dass der Typ nicht derselbe ist.

Gibt es eine Möglichkeit, einen zugeordneten Typ zwischen zwei Protokollen zu teilen, um mein Problem zu beheben? Vielen Dank.

+0

vielleicht bedeuten Ihnen ein Protokoll zu machen, die von der anderen 2 – Alexander

+0

@AlexanderMomchliov erbt - ich habe es schon versucht (https://gist.github.com/anonymous/58fb6e95549081ba8eff9c7fc81d6fc2) und es nicht mit dem gleichen Fehler. – MartinMoizard

Antwort

2

Das Problem ist, dass es für eine Implementierung von MyView möglich ist DataType ein LayoutType mit einer anderen DataType seine eigenen. Sobald SE-0142: Permit where clauses to constrain associated types implementiert ist, werden Sie nur in der Lage sein, zu sagen:

associatedtype LayoutType : MyLayout where LayoutType.DataType == DataType 

, um zu erzwingen, dass konforme Typen ein LayoutType mit einem passenden DataType haben muss.

Bis zu diesem Zeitpunkt ist es wahrscheinlich das Beste, was Sie tun können, wenn Sie die Einschränkung der Erweiterung hinzufügen. Dadurch wird nur die Standardimplementierung von doLayout() verfügbar, wenn die DataType s übereinstimmen.

extension MyView where LayoutType.DataType == DataType { 
    func doLayout() { 
     layout.computeLayout(with: data) 
    } 
} 
Verwandte Themen