2014-12-24 29 views
6

我在我的一个类中有一个通用方法,我想要一个符合UIViewControllerUIPickerViewDelegate的通用类型。我怎样才能做到这一点?我想这样做的:符合两种协议的Swift通用类型

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

但是这个代码不“承认”的UIPickerViewDelegate。我也想用管道|代替逗号,但这更糟糕,编译器不接受。 是否可以这样做,或者我必须为类和协议做2个参数吗?还是有更好的解决方法?

感谢您的帮助和圣诞快乐:]

回答

12

您的代码:

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

声明泛型参数:

  • T这是UIViewController。它被用作viewController参数类型。
  • UIPickerViewDelegate这是Any。并没有使用。

相反,你应该使用"Where Clause",如:

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

非常感谢您!我不知道关键字'where'可以在那里使用。但现在当我通过'.foo(viewController:self)在我的viewController(符合UIPickerViewDelegate)调用这个方法时,我有另一个问题'我得到以下错误:'类型'UIViewController'不符合协议'UIPickerViewDelegate''。有什么问题?再次感谢您的帮助:) – borchero

+0

'类MyViewController:UIViewController,UIPickerViewDelegate {...}'为我工作。你如何声明viewController? – rintaro

+0

我还有一些其他协议:'UITableViewDataSource','UITableViewDelegate','UIPickerViewDataSource' – borchero

相关问题