2014-12-24 20 views
6

Ho un metodo generico in una delle mie classi in cui desidero avere un tipo generico conforme a UIViewController e UIPickerViewDelegate. Come lo posso fare? Ho pensato di fare questo:Tipo generico Swift conforme a due protocolli

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

Ma questo codice non "riconoscere" il UIPickerViewDelegate. Ho anche pensato di usare la pipe | invece della virgola ma questo è ancora peggio, il compilatore non lo accetta. E 'possibile farlo o devo fare 2 parametri per la classe e il protocollo? O c'è una soluzione migliore?

Grazie per il vostro aiuto e Buon Natale:]

risposta

12

tuo codice:

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

dichiara generici parametri:

  • T che è UIViewController. Ed è utilizzato come tipo di parametro viewController.
  • UIPickerViewDelegate che è Any. E non è usato.

Invece, si dovrebbe usare "Where Clause", come:

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

Grazie mille! Non sapevo che la parola chiave 'where' possa essere utilizzata lì. Ma ora ho un altro problema quando chiami questo metodo nel mio viewController (conforme a UIPickerViewDelegate) di '.foo (viewController: self)' Ricevo il seguente errore: 'Type 'UIViewController' non è conforme al protocollo 'UIPickerViewDelegate''. Qual è il problema? Grazie ancora per qualsiasi aiuto;) – borchero

+0

'classe MyViewController: UIViewController, UIPickerViewDelegate {...}' funziona per me. Come si dichiara viewController? – rintaro

+0

Ho anche altri protocolli: 'UITableViewDataSource',' UITableViewDelegate', 'UIPickerViewDataSource' – borchero

Problemi correlati