Ich habe mehrere Protokolle, die den gleichen Funktionsnamen haben. Einige Protokolle haben zugeordnete Typen, bei denen ich nicht herausfinden kann, wie man die Funktionen aufruft, wie ich es bei nicht-generischen Protokollen mache. Ich erhalte den Fehler: Protocol 'MyProtocol1' can only be used as a generic contraint because it has Self or associated type requirements
Mehrdeutige Funktionen in mehreren Protokollerweiterungen?
Hier ist, was ich versuche zu tun:
protocol Serviceable {
associatedtype DataType
func get(handler: ([DataType] -> Void)?)
}
struct PostService: Serviceable {
func get(handler: ([String] -> Void)? = nil) {
print("Do something...")
}
}
protocol MyProtocol1: class {
associatedtype ServiceType: Serviceable
var service: ServiceType { get }
}
extension MyProtocol1 {
func didLoad(delegate: Self) {
print("MyProtocol1.didLoad()")
}
}
protocol MyProtocol2: class {
}
extension MyProtocol2 {
func didLoad(delegate: MyProtocol2) {
print("MyProtocol2.didLoad()")
}
}
class MyViewController: UIViewController, MyProtocol1, MyProtocol2 {
let service = PostService()
override func viewDidLoad() {
super.viewDidLoad()
didLoad(self as MyProtocol1) // Error here: Protocol 'MyProtocol1' can only be used as a generic contraint because it has Self or associated type requirements
didLoad(self as MyProtocol2)
}
}
Wie kann ich die Funktion von einer generischen Protokollerweiterung speziell nennen?
Tatsächlich riecht es. Ich versuche, Mehrfachvererbung unter Verwendung der Protokollerweiterungen zu erreichen. Zum Beispiel würde ich in der 'viewDidLoad' meines' UIViewController' jede 'didLoad' Funktion jedes meiner Protokolle ausführen wollen. – TruMan1
Dann sollten Sie eine Eigenschaft wie 'loader: [Loader]' haben, die die verschiedenen Initialisierungen enthält, die Sie benötigen. –
Ich würde wahrscheinlich tiefer über die Namen hier nachdenken, damit sie den aktuellen Swift Style Richtlinien entsprechen, aber das obige ist immer noch so, wie ich es sicherlich angreifen würde. –