Правильный способ добавления наследования универсальных типов - PullRequest
0 голосов
/ 25 июня 2019

Я создал эти классы:

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' наследовалfrom 'BaseViewModel <Any>'

Если я удалю BaseViewModel<Any> из моего общего параметра BaseViewController, то ошибка исчезнет.Но я хочу ограничить универсальный ViewModel контроллера представления, чтобы он наследовал только от BaseViewModel.

Есть идеи, как это сделать?

1 Ответ

0 голосов
/ 25 июня 2019

Специализированный тип 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")
    }
}

Если цель состоит в том, чтобы дать контроллерам представлений конкретную типизированную модель представления, с которой следует играть, то это должно быть сделано.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...