Swift 使用协议&x27;泛型函数中的关联类型
我试图在我的应用程序中编写一个简单的MVP模式,因此我编写了两个porotocol来定义视图控制器和演示者: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
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
}
}
如果两个协议都有关联的类型,我不确定它们是否可以相互使用