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.