Swift 使用协议&x27;泛型函数中的关联类型

Swift 使用协议&x27;泛型函数中的关联类型,swift,swift-protocols,Swift,Swift Protocols,我试图在我的应用程序中编写一个简单的MVP模式,因此我编写了两个porotocol来定义视图控制器和演示者: protocol PresenterType: class { associatedtype ViewController: ViewControllerType var viewController: ViewController? { get set } func bind(viewController: ViewController?) } proto

我试图在我的应用程序中编写一个简单的MVP模式,因此我编写了两个porotocol来定义视图控制器和演示者:

protocol PresenterType: class {
    associatedtype ViewController: ViewControllerType

    var viewController: ViewController? { get set }

    func bind(viewController: ViewController?)
}

protocol ViewControllerType: class {
    associatedtype Presenter: PresenterType

    var presenter: Presenter { get }

    init(presenter: Presenter)
}
定义了这些之后,我开始编写一些
RootViewController
RootViewPresenter
。后者看起来像:

protocol RootViewControllerType: ViewControllerType {
}

final class RootPresenter<VC: RootViewControllerType>: PresenterType {
    weak var viewController: VC?

    func bind(viewController: VC?) {
        self.viewController = viewController
    }
}
协议根ViewControllerType:ViewControllerType{
}
最终类RootPresenter:PresenterType{
弱var视图控制器:VC?
func绑定(视图控制器:VC?){
self.viewController=viewController
}
}
到目前为止,一切正常,但当我开始像这样实现View Controller时:

protocol RootPresenterType: PresenterType {
}

final class RootViewController<P: RootPresenterType>: UIViewController, ViewControllerType {
    let presenter: P

    init(presenter: Presenter) {
        self.presenter = presenter
        super.init(nibName: nil, bundle: nil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        presenter.bind(viewController: self)
    }
}
协议根PresenterType:PresenterType{
}
最终类RootViewController:UIViewController,ViewControllerType{
让演示者:P
初始化(演示者:演示者){
self.presenter=演示者
super.init(nibName:nil,bundle:nil)
}
必需的初始化?(编码器aDecoder:NSCoder){
fatalError(“初始化(编码者:)尚未实现”)
}
重写func viewDidLoad(){
super.viewDidLoad()
presenter.bind(视图控制器:self)
}
}
我立即收到以下错误消息:

无法将“RootViewController”类型的值转换为预期的参数类型“\u1”


我知道带有关联类型的
protocol
s可能会引入一些限制,但是这个示例非常简单,我无法让它工作。有可能实现我想要的东西吗,或者我必须寻找其他不那么快速的模式吗?

我认为,由于
PresenterType
ViewControllerType
协议各自关联类型之间的循环依赖性,您不可能实现想要的目标

考虑一下上面的可疑代码是否编译过。。。您将如何实例化
RootPresenter
RootViewController
类?由于两者相互依赖,最终会出现如下错误:

如您所见,由于关联的类型,编译器无法完全解析泛型参数

我认为最好的办法是从一个或两个协议中删除关联的类型。例如,从
PresenterType
协议中删除关联的类型并更新
RootPresenter
类会打破循环依赖关系,并允许代码正常编译

protocol PresenterType: class {
    var viewController: UIViewController? { get set }

    func bind(viewController: UIViewController?)
}

final class RootPresenter: PresenterType {
    weak var viewController: UIViewController?

    func bind(viewController: UIViewController?) {
        self.viewController = viewController
    }
}

如果两个协议都有关联的类型,我不确定它们是否可以相互使用