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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了符合两种协议的Swift泛型类型相关的知识,希望对你有一定的参考价值。

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

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

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

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

答案

你的代码:

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

声明2个泛型参数:

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

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

func foo<T: UIViewController where T:UIPickerViewDelegate> (#viewController: T) {}
另一答案

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

另一答案

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

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

以上是关于符合两种协议的Swift泛型类型的主要内容,如果未能解决你的问题,请参考以下文章

Swift:检查泛型类型是不是符合协议

具有泛型的Swift函数,其中约束是自身符合的协议

如何在本机 Swift 中实现以前称为 NSMutableOrderedSet 的可变有序集泛型类型?

泛型约束-swift

Swift 3:修复问题类型“className”不符合协议“UIDocumentPickerDelegate”

Swift 泛型和协议扩展