2016-04-25 2 views
0

Ich versuche ein Protokoll zu erstellen, das Daten für View-Controller bereitstellt. Ich versuche den Protokollansatz zu nehmen und mache die Dinge flexibel, so dass die View-Controller mit jeder Art von Daten konform gehen können.Wie erstellt man protokollorientierte generische Dienste?

Allerdings erhalte ich die Fehlermeldung: Protocol 'Serviceable' can only be used as a generic contraint because it has Self or associated type requirements

Das ist, was ich versuche zu tun:

protocol Serviceable { 
    associatedtype DataType 
    func get(handler: ([DataType] -> Void)?) 
} 

struct PostService: Serviceable { 
    func get(handler: ([Postable] -> Void)? = nil) { 
     print("Do something...") 
    } 
} 

struct AuthorService: Serviceable { 
    func get(handler: ([Authorable] -> Void)? = nil) { 
     print("Do something...") 
    } 
} 

protocol Postable { 
    var title: String { get set } 
    var content: String { get set } 
} 

protocol ServiceControllable: class { 
    var service: Serviceable { get } // Error: Protocol 'Serviceable' can only be used as a generic contraint because it has Self or associated type requirements 
} 

extension ServiceControllable { 
    func setupDataSource() { 
     service.get { items in 
      // Do something 
     } 
    } 
} 

class MyViewController: ServiceControllable { 
    let service: Serviceable = PostService() // Error: Same as above 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     setupDataSource() 
    } 
} 

Wie kann ich dies so, dass meine Ansicht-Controller ServiceControllable implementieren können und Zugriff auf eine generische setupDataSource haben, die Tabellen, Sammlungen usw. füllt?

Antwort

Verwandte Themen