符合两种协议的Swift泛型类型

时间:2014-12-24 08:30:15

标签: generics swift ios8

我的某个类中有一个泛型方法,我想要一个符合UIViewControllerUIPickerViewDelegate的泛型类型。我怎样才能做到这一点?我想过这样做:

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

但是这段代码并没有“识别”UIPickerViewDelegate。我还想过使用管道|而不是逗号,但更糟糕的是,编译器不接受它。 是可以这样做还是我必须为类和协议做2个参数?或者有更好的解决方法吗?

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

3 个答案:

答案 0 :(得分:19)

您的代码:

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

声明 2 泛型参数:

  • TUIViewController。它用作viewController参数类型。
  • UIPickerViewDelegateAny。它没有被使用。

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

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

答案 1 :(得分:5)

Swift 4 中的内容已经改变: func foo<T: UIViewController> (viewController: T) where T:UIPickerViewDelegate {}

答案 2 :(得分:3)

由于 Swift 4 ,您可以使用协议组成的功能。 在这里,您去了:

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