2017-04-27 2 views
0

Was ich tun werde ist, unsere App in Swift zu modularisieren. Module kommunizieren miteinander über ein Protokoll (Service genannt). Hier ist meine Vermutung:Gibt es eine Möglichkeit, eine Klasse in Swift einem generischen Protokoll anzupassen?

protocol Service { 
    var provider: Any? { get } 
} 

struct ServiceProvider<T> { 
    static func provider() -> Any? { 

     // compile error here, any workaround? 
     struct Imp: T {} 
     return Imp.provider 
    } 
} 

/********** Shopping Trolly Module ************/ 

public protocol ShoppingTrollyService {} 

// provide 
extension ShoppingTrollyService { 
    var provider: Any? { 
     return ShoppingTrollyServiceProvider() 
    } 
} 

//this class can not be accessed from other module directly 
class ShoppingTrollyServiceProvider: ShoppingTrollyService {} 

Dann in anderen Modul:

let x = ServiceProvider<ShoppingTrollyService>.provider() 
// then call function provided by ShoppingTrollyService 

Aber ich bin auf die Schaffung eines konkreten Beispiel konformen einige Protokoll fest (als Fehler oben). Irgendeine Idee?

Antwort

0

Der Compiler Fehler ist, weil es unbekannt ist, welcher Typ T ist, daher ist es unbekannt, dass es ein Mitglied provider() hat. Sie können dem Compiler mitteilen, dass T ein Service sein muss, indem Sie seinen Typ einschränken.

struct ServiceProvider<T:Service> { // Notice the constraint on T 
    static func provider() -> Any? { 

     struct Imp: T {} 
     return Imp.provider // We can call this because we know T must conform to Service 
    } 
} 
Verwandte Themen