简体   繁体   中英

Swift generic type conforming to two protocols

I have a generic method in one of my classes where I want to have a generic type conforming to UIViewController and UIPickerViewDelegate . How can I do that? I thought of doing this:

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

But this code doesn't "recognize" the UIPickerViewDelegate . I also thought of using the pipe | instead of the comma but this is even worse, the compiler doesn't accept that. Is it possible to do this or do I have to do 2 parameters for the class and the protocol? Or is there a nicer workaround?

Thanks for your help and Merry Christmas :]

Your code:

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

declares 2 generics parameters:

  • T which is UIViewController . And it's used as viewController parameter type.
  • UIPickerViewDelegate which is Any . And it's not used.

Instead, you should use "Where Clause" , like:

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

Swift 4中已经改变了一些东西: func foo<T: UIViewController> (viewController: T) where T:UIPickerViewDelegate {}

Since Swift 4 you can use the power of Protocol Composition . Here you go:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM