У меня есть дело, которое:
class BaseMvpController<V, P: BasePresenter>: UIViewController { }
Мне нужно сделать базовый класс универсального типа вместо UIViewController
.
ВВ какой-то момент мне нужно, чтобы он был UIViewController , UITableViewController
..etc
Например:
Мой базовый класс
class BaseMvpController<V, P: BasePresenter>: UIViewController {
typealias View = V
private(set) var presenter: P!
// MARK: - Initializers
required public init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
override public init(nibName: String?, bundle: Bundle?) {
super.init(nibName: nibName, bundle: bundle)
}
deinit {
guard let view = self as? P.View else {return}
if let presenter = presenter {
presenter.detachView(view)
}
}
// MARK: - Lifecycle
override func viewDidLoad() {
super.viewDidLoad()
presenter = createPresenter()
}
override func viewWillAppear(_ animated: Bool) {
guard let view = self as? P.View else {
preconditionFailure("MVP ViewController must implement the view protocol `\(View.self)`!")
}
super.viewWillAppear(animated)
if !presenter.isAttached {
presenter.attachView(view)
}
}
// MARK: - MVP
/// Override and return a presenter in a subclass.
func createPresenter() -> P {
preconditionFailure("MVP method `createPresenter()` must be override in a subclass and do not call `super.createPresenter()`!")
}
}
Мой AController
class AController : BaseMvpController <AView, APresenter> { }
Если мы думали, что это своего рода UIViewController, то он работает нормально
My BController
class BController : BaseMvpController <AView, APresenter> { }
Если мы подумали, что это что-то вроде UITableViewController
, это случай, когда я не могу переопределить numberOfItemInRaw
и dequeCell ... и т. Д., Поскольку базовый контроллер наследуется от UIViewController
Я хочу, чтобы базовый контроллер работал со всеми контроллерами (UIViewController
, UITableViewController
, UICollectionViewController
.. и т. Д.).
Как я могу это сделать