Я пытаюсь написать простой шаблон MVP, который будет следовать в моем приложении, поэтому я написал два протокола для определения View Controller и Presenters:
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
}
}
До этого момента все соответствует и отлично , но когда я начинаю реализовывать 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)
}
}
НемедленноЯ получаю следующее сообщение об ошибке:
Невозможно преобразовать значение типа 'RootViewController
' в ожидаемый тип аргумента '_?'
Я знаю, что protocol
s со связанными типами могут вводить некоторые ограничения, но этот пример довольно прост, и я не могу заставить его работать.Можно ли достичь чего-то, чего я хочу, или мне нужно искать какой-то другой, менее Swifty шаблон?