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?