2014-12-24 18 views
6

Ich habe eine generische Methode in einer meiner Klassen, wo ich einen generischen Typ haben möchte, der UIViewController und UIPickerViewDelegate entspricht. Wie kann ich das machen? Ich dachte, dies zu tun:Swift generischer Typ, der zwei Protokollen entspricht

func foo<T: UIViewController, UIPickerViewDelegate> (#viewController: T) {} 

Aber dieser Code nicht „erkennen“ die UIPickerViewDelegate. Ich dachte auch an die Verwendung der Pipe | anstelle des Kommas, aber das ist noch schlimmer, der Compiler akzeptiert das nicht. Ist das möglich oder muss ich 2 Parameter für die Klasse und das Protokoll angeben? Oder gibt es einen besseren Workaround?

Vielen Dank für Ihre Hilfe und Frohe Weihnachten:]

Antwort

12

Ihr Code:

func foo<T: UIViewController, UIPickerViewDelegate> (#viewController: T) {} 

erklärt Generika Parameter:

  • T die UIViewController ist. Und es wird als viewController Parametertyp verwendet.
  • UIPickerViewDelegate das ist Any. Und es wird nicht benutzt. Statt

, sollten Sie "Where Clause" verwenden, wie:

func foo<T: UIViewController where T:UIPickerViewDelegate> (#viewController: T) {} 
+0

Thank you very much! Ich wusste nicht, dass das Schlüsselwort 'where' dort verwendet werden kann. Aber jetzt habe ich ein anderes Problem beim Aufruf dieser Methode in meinem ViewController (entspricht UIPickerViewDelegate) von '.foo (viewController: self)' Ich bekomme den folgenden Fehler: 'Typ 'UIViewController' entspricht nicht Protokoll 'UIPickerViewDelegate''. Was ist das Problem? Danke für jede Hilfe nochmal;) – borchero

+0

'Klasse MyViewController: UIViewController, UIPickerViewDelegate {...}' funktioniert bei mir. Wie deklariert man den viewController? – rintaro

+0

Ich habe auch einige andere Protokolle: 'UITableViewDataSource',' UITableViewDelegate', 'UIPickerViewDataSource' – borchero

Verwandte Themen