问题
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 :]
回答1:
Your code:
func foo<T: UIViewController, UIPickerViewDelegate> (#viewController: T) {}
declares 2 generics parameters:
Twhich isUIViewController. And it's used asviewControllerparameter type.UIPickerViewDelegatewhich isAny. And it's not used.
Instead, you should use "Where Clause", like:
func foo<T: UIViewController where T:UIPickerViewDelegate> (#viewController: T) {}
回答2:
Things have been changed in Swift 4:
func foo<T: UIViewController> (viewController: T) where T:UIPickerViewDelegate {}
回答3:
Since Swift 4 you can use the power of Protocol Composition. Here you go:
func foo<T: UIViewController & UIPickerViewDelegate> (viewController: T) {}
来源:https://stackoverflow.com/questions/27633872/swift-generic-type-conforming-to-two-protocols