无法将涉及泛型的特定子类的类型转换变量

时间:2018-08-03 11:37:39

标签: ios swift generics

  

注意:很抱歉,无法提供比这更好的标题,所以请   如果您在阅读完问题后遇到一个问题,建议提出一个更好的问题

我有一个BasePresenter类,应该将BaseInteractorBaseRouter作为其init的参数,并且BasePresenter的每个子类都应该能够在实现中指定BaseInteractorBaseRouter的子类

所以我已将我的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
}

显然PRBaseCollectionsInteractorPRBaseInteractor的子类,而PRBaseCollectionRouterPRBaseRouter的子类

一切正常,直到这里正常。现在来了问题。每个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'总是失败

尝试忽略它并运行将导致崩溃:(

如何解决此问题?我究竟做错了什么?还是这种方法完全错误?

0 个答案:

没有答案