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

bor*_*ero 10 generics swift ios8

我在我的一个类中有一个泛型方法,我想要一个符合UIViewController和的泛型类型UIPickerViewDelegate.我怎样才能做到这一点?我想过这样做:

func foo<T: UIViewController, UIPickerViewDelegate> (#viewController: T) {}
Run Code Online (Sandbox Code Playgroud)

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

谢谢你的帮助和圣诞快乐:]

rin*_*aro 20

你的代码:

func foo<T: UIViewController, UIPickerViewDelegate> (#viewController: T) {}
Run Code Online (Sandbox Code Playgroud)

声明2个泛型参数:

  • T是的UIViewController.它用作viewController参数类型.
  • UIPickerViewDelegate是的Any.并没有使用它.

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

func foo<T: UIViewController where T:UIPickerViewDelegate> (#viewController: T) {}
Run Code Online (Sandbox Code Playgroud)


Bil*_*fas 8

Swift 4 开始,您可以使用Protocol Composition的强大功能。干得好:

func foo<T: UIViewController & UIPickerViewDelegate> (viewController: T) {}
Run Code Online (Sandbox Code Playgroud)


Vla*_*pko 6

Swift 4中发生了一些变化: func foo<T: UIViewController> (viewController: T) where T:UIPickerViewDelegate {}