Специализированный тип BaseViewModel<MyNavigator>
отличается от специализированного типа BaseViewModel<Any>
.Я подозреваю, что вы представляете это, как BaseViewModel<MyNavigator>
может переопределить / наследовать от BaseViewModel<Any>
, поскольку MyNavigator
является более конкретным Any
.Но Свифт не работает таким образом.Я не знаю достаточно о внутренностях 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")
}
}
Если цель состоит в том, чтобы дать контроллерам представлений конкретную типизированную модель представления, с которой следует играть, то это должно быть сделано.