Как объявить универсальный базовый класс? - PullRequest
0 голосов
/ 16 марта 2019

У меня есть дело, которое:

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 .. и т. Д.).

Как я могу это сделать

1 Ответ

1 голос
/ 16 марта 2019

Вы можете «спрятать» универсальный внутри другого класса.

Например,

class Generic<T, U> { }
class BV: UIViewController {
    var generic: Generic<Int, String>? = nil
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...