我创建了这些类:

class BaseViewModel<NavigatorType> {
    typealias Navigator = NavigatorType

    var navigator: Navigator!
}

class BaseViewController<ViewModel: BaseViewModel<Any>>: UIViewController {
    typealias ViewModel = ViewModel

    var viewModel: ViewModel!
}

class MyVC: BaseViewController<MyViewModel> {

}

class MyViewModel: BaseViewModel<MyNavigator> {

}


现在的问题是我在MyVC类上收到此错误:


  'BaseViewController'要求'MyViewModel'从继承
  'BaseViewModel <Any>'


如果我从BaseViewModel<Any>通用参数中删除了BaseViewController,则错误消失了。但是我想限制视图控制器的通用ViewModel只能从BaseViewModel继承。

任何想法如何做到这一点?

最佳答案

专用类型BaseViewModel<MyNavigator>与专用类型BaseViewModel<Any>不同。我怀疑您是在想像它像BaseViewModel<MyNavigator>可以从BaseViewModel<Any>覆盖/继承,因为MyNavigator是更具体的Any。但是Swift不能那样工作。我对Swift的内部了解不多,为什么不知道为什么,但事实并非如此!

也许尝试改为使BaseViewModel成为协议:

protocol BaseViewModel {
    associatedtype Navigator

    var navigator: Navigator! { get }
}

class BaseViewController<ViewModel: BaseViewModel>: UIViewController {
    var viewModel: ViewModel!
}

class MyVC: BaseViewController<MyViewModel> {
    func foo() {
        viewModel.navigator.bar()
        print(viewModel.mySpecificProperty)
    }
}

class MyViewModel: BaseViewModel {
    var navigator: MyNavigator!
    var mySpecificProperty: String = "Hello!"
}

class MyNavigator {
    func bar() {
        print("MyNavigator bar")
    }
}


如果目标是为视图控制器提供特定的类型化视图模型,则应该这样做。

10-06 07:43