2014-12-24 13 views
6

Mam ogólnej metody w jednej z moich klas, gdzie chcę mieć rodzaj rodzajowy zgodny z UIViewController i UIPickerViewDelegate. Jak mogę to zrobić? Myślałem, że w ten sposób:Swift ogólny typ zgodny z dwoma protokołami

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

Ale ten kod nie „rozpoznać” UIPickerViewDelegate. Pomyślałem także o użyciu rurki | zamiast przecinka, ale jest jeszcze gorzej, kompilator tego nie akceptuje. Czy można to zrobić, czy muszę wykonać 2 parametry dla klasy i protokołu? Czy istnieje ładniejsze obejście?

Dzięki za pomoc i Wesołych świąt:]

Odpowiedz

12

Kod:

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

deklaruje leków generycznych parametry:

  • T który jest UIViewController. I jest używany jako typ parametru viewController.
  • UIPickerViewDelegate która jest Any. I nie jest używany.

Zamiast tego należy użyć "Where Clause", jak:

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

Dziękuję bardzo! Nie znałem słowa kluczowego "where", które można tam użyć. Ale teraz mam inny problem, wywołując tę ​​metodę w moim viewController (zgodnym z UIPickerViewDelegate) przez '.foo (viewController: self)' Otrzymuję następujący błąd: 'Type 'UIViewController' nie jest zgodny z protokołem 'UIPickerViewDelegate''. Jaki jest problem? Dzięki za pomoc ponownie;) – borchero

+0

'klasa MyViewController: UIViewController, UIPickerViewDelegate {...}' działa dla mnie. Jak zadeklarować viewController? – rintaro

+0

Mam również inne protokoły: 'UITableViewDataSource',' UITableViewDelegate', 'UIPickerViewDataSource' – borchero

Powiązane problemy