注意:很抱歉,无法提供比这更好的标题,所以请 如果您在阅读完问题后遇到一个问题,建议提出一个更好的问题
我有一个BasePresenter
类,应该将BaseInteractor
和BaseRouter
作为其init
的参数,并且BasePresenter
的每个子类都应该能够在实现中指定BaseInteractor
和BaseRouter
的子类
所以我已将我的BasePresenter
声明为
open class PRBasePresenter<T: PRBaseInteractor, R: PRBaseRouter> {
var interactor: T!
var router: R!
let disposeBag = DisposeBag()
convenience init(with router : R, interactor : T) {
self.init()
self.router = router
self.interactor = interactor
}
}
现在PRBaseCollectionsPresenter
的子项PRBasePresenter
声明其交互者和路由器为
class PRBaseCollectionsPresenter: PRBasePresenter<PRBaseCollectionsInteractor, PRBaseCollectionRouter> {
//other code here
}
显然PRBaseCollectionsInteractor
是PRBaseInteractor
的子类,而PRBaseCollectionRouter
是PRBaseRouter
的子类
一切正常,直到这里正常。现在来了问题。每个ViewController
应该具有presenter
作为属性。所以我有一个协议强制使用
protocol PresenterInjectorProtocol {
var presenter : PRBasePresenter<PRBaseInteractor, PRBaseRouter>! { get set }
}
然后我的BaseViewController
确认PresenterInjectorProtocol
public class PRBaseViewController: UIViewController,PresenterInjectorProtocol {
var presenter: PRBasePresenter<PRBaseInteractor, PRBaseRouter>!
//other code...
}
现在可以说我有ChildViewController,由于继承它显然会得到presenter
,但是显然child想要拥有其特定的presenter
而不是拥有一个通用的。而且显然在Swift中,当您覆盖属性时,您无法更改变量的类型。因此,唯一的方法是
class PRBaseTableViewController: PRBaseViewController {
var tableSpecificPresenter: PRBaseCollectionsPresenter {
get {
return self.presenter as! PRBaseCollectionsPresenter
}
}
//other code goes here
}
这给了我一个警告
从“ PRBasePresenter!”发布至 不相关的类型'PRBaseCollectionsPresenter'总是失败
尝试忽略它并运行将导致崩溃:(
如何解决此问题?我究竟做错了什么?还是这种方法完全错误?