我创建了这些类:
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")
}
}
如果目标是为视图控制器提供特定的类型化视图模型,则应该这样做。