2017-06-02 3 views
0

Ich habe einen Rahmen ProviderFramework mit folgendem Inhalt:Ausgabe mit allen Protokollen mit assoziierten Typen in Swift

public class Provider { 

    public func fun(some: Model) { 

    } 

} 

public class Model { 

    public let id: Int 

    init(id: Int) { 
     self.id = id 
    } 

} 

und anderen UserFramework mit folgendem Inhalt:

public protocol ProviderProtocol { 

    func fun(some: ModelProtocol) 

} 

public protocol ModelProtocol { 

    var id: Int {get} 

} 

Was ich will, ist das zu machen Die Provider-Klasse entspricht der ProviderProtocol-Klasse. So in einem Rahmen, der sowohl von dem zuvor genannten Frameworks importiert Ich habe dies:

extension ProviderFramework.Model: UserFramework.ModelProtocol {} 
extension ProviderFramework.Provider: UserFramework.ProviderProtocol {} 

Leider führt dies zu einem Fehler für die zweite Konformität. Also habe ich versucht, ein zugeordnetes Typen verwenden und meine ProviderProtocol in diese gedreht:

public protocol ProviderProtocol { 

    associatedtype T: ModelProtocol 

    func fun(some: T) 

} 

und die problematische Konformität dazu:

extension ProviderFramework.Provider: UserFramework.ProviderProtocol { 
    public typealias T = ProviderFramework.Model 
} 

Jetzt gibt es keine Fehler kompilieren, aber wenn ich will

class Consumer { 

    var provider: ProviderProtocol? 

} 

ich wieder einen Fehler: das Protokoll als eine Art, wie diese zu verwenden ‚Protokoll‚ProviderProtocol‘kann nur als generische Einschränkung verwendet werden, weil es Selbst oder hat ssociated Typ Anforderungen '

Ich möchte in der Lage sein, die letzte Sache zu tun. Habe ich einen Fehler in meinem Code oder gibt es eine alternative Lösung für dieses Problem?

Vielen Dank im Voraus.

Antwort

0

Nach dem zweiten Ansatz, warum nicht Provider anstelle von ProviderProtocol verwenden? Da Sie typealias T als ProviderFramework.Model in der Erweiterung der Klasse Provider bestätigt haben. Diese

class Consumer { 
    var provider: Provider? 
} 
+0

: Erweiterung Anbieter: ProviderProtocol { öffentlichen func Spaß (etwas: ModelProtocol) { } } fügt eine weitere Funktion auf die Provider-Klasse, die nicht mein Punkt ist. Ich möchte die öffentliche Func Spaß (einige: Modell) Funktion, um irgendwie die Provider-Klasse mit dem ProviderProtocol konform zu machen, so dass die ursprüngliche Methode aufgerufen wird, wenn für die Spaß-Funktion aufrufen. –

+0

Warum nicht direkt den Provider ändern? Klingt wie die Provider Klasse gesperrt ist, kann es nicht ändern? Sie möchten also die Erweiterung verwenden, um das ursprüngliche Verhalten zu überschreiben? –

+0

Wenn ich die Provider-Klasse ändern, um dem ProviderProtocol zu entsprechen, muss ich das UserFramework im ProviderFramework importieren, was eine Abhängigkeit zwischen ihnen erzeugt, die ich nicht möchte. Ich möchte die Abhängigkeit in einer dritten Klasse außerhalb der Frameworks auflösen, die beide importiert. –

Verwandte Themen