Swift 中的多个泛型参数

cap*_*low 5 generics ios swift

我想在 swift 中有函数,它需要两个参数,这些参数必须有一些基类,每个参数都面对不同的协议。

class func createContainerViewController<T:UIViewController, U:UIViewController>(withCenterViewController centerViewController: T, andLeftViewController leftViewController: U) -> ContainerViewController where T: CenterViewController, U: SidePanelViewController
Run Code Online (Sandbox Code Playgroud)

但是每当我尝试使用这样的方法时:

let left: SidePanelViewController = UIStoryboard.leftViewController()!
let center: EventsListViewController = UIStoryboard.eventsListViewController()!

let containerViewController = ContainerViewController.createContainerViewController(withCenterViewController: center, andLeftViewController: left)
Run Code Online (Sandbox Code Playgroud)

Xcode 给我一个错误

无法推断通用参数“T”

变量 center 和 left 都是继承自 UIViewController 的类的实例,并面对所需的 T 或 U 协议。

在 createContainerViewController 函数中的用法:

let container = ContainerViewController()

container.centerViewController = centerViewController
var centerViewController = container.centerViewController as! CenterViewController
centerViewController.delegate = container

container.leftViewController = leftViewController
var leftViewController = container.leftViewController as! SidePanelViewController
leftViewController.delegate = container

return container
Run Code Online (Sandbox Code Playgroud)

Sam*_*Sam 0

这应该有效。

protocol CenterViewController {}
protocol SidePanelViewController {}

class Center: UIViewController, CenterViewController {}
class Left: UIViewController, SidePanelViewController {}

class ContainerViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let center = Center()
        let left = Left()
        let _ = ContainerViewController.createContainerViewController(withCenterViewController: center, andLeftViewController: left)
    }

    class func createContainerViewController<T:UIViewController, U:UIViewController>(withCenterViewController centerViewController: T, andLeftViewController leftViewController: U) -> ContainerViewController where T: CenterViewController, U: SidePanelViewController {
        return ContainerViewController()
    }
}
Run Code Online (Sandbox Code Playgroud)