2017-02-27 4 views
0

Ich möchte ein Protokoll (Delegat) erstellen, die die aktuelle UIViewController.present -Funktion erfüllt.Swift-Protokoll für present() -Funktion in UIViewController

so zum Beispiel das Protokoll:

protocol PresentPopupDelegate 
{ 
    func doSomething() 
    func present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Swift.Void)?) 
} 

Die Klasse, die diesem Protokoll entsprechen muss, ist:

class MyViewController:UIViewController, PresentPopupDelegate { 

     func doSomething() 
} 

und können sagen, dass ich diesen Code haben:

let delegate:PresentPopupDelegate 

init() { 
    self.delegate = MyViewController() 
} 

Kompilieren wird dies zu einer Warnung sagen

führen

Methode ‚vorhanden: animated: Abschluss:‘ in Protokoll ‚PresentPopupDelegate‘ nicht

implementiert

Jetzt gehe davon aus, dass der i der Grund ist, weil in der ursprünglichen Funktion einen Standardparameter auf die Vervollständigungsfunktion hat als "Null". Protokolle unterstützen jedoch keine Standardparameter.

Also zu meiner Frage: Kann ich, und wenn ja, ein Protokoll erstellen, in dem sich die UIViewController.present (...) -Funktion anpassen kann?

Antwort

3

Typen entsprechen nicht den Protokollen, nur weil sie die richtigen Funktionen in ihnen haben. Sie müssen explizit sagen, dass der Typ konform ist. In Ihrem Fall bedeutet, dass nur das Hinzufügen:

extension UIViewController: PresentPopupDelegate {} 

Es für einen Körper hier nicht notwendig ist, da es bereits die richtigen Implementierungen hat.

Diese Entscheidung, explizite Konformität zu verlangen, war eine absichtliche Designentscheidung in Swift. Siehe Ole Begemanns ausgezeichnete Zusammenfassung der Argumentation in Protocols are more than Bags of Syntax.

+0

Guter Anruf. Und eine tolle Lektüre !!!, ich habe die Erweiterung zu UIViewController hinzugefügt. Aber jetzt bekomme ich den folgenden Fehler: Methode 'presentViewController: animiert: Vervollständigung:' von Methode bereitgestellt 'vorhanden (_: animiert: Vervollständigung :)' stimmt nicht mit dem Selektor der Anforderung überein ('vorhanden: animiert: Vervollständigung:') – giLisH

+0

I kann das nicht reproduzieren. Sind Sie sicher, dass Ihr Protokoll genau das ist, was Sie hier aufgelistet haben? Sind Sie sicher, dass Sie das _ _ vor dem ersten Parameter nicht übersehen? –

+0

Ich habe die Frage bearbeitet, um besser zu reflektieren, was ich versuche zu tun. Zu Ihrem q: das _ fehlt nicht von der Funktion. Danke! – giLisH

Verwandte Themen