Как объявить базовые классы в дженериках Swift? - PullRequest
0 голосов
/ 29 ноября 2018

Пример кода, который не работает, но я хотел бы, чтобы он был скомпилирован с успехом.Идея очень хорошо описана в следующем исходном коде.Вы можете легко вставить его на игровую площадку Swift.

import UIKit

// MARK: - Base classes with generics

class FlowController {

}

class ViewModel<FlowControllerType: FlowController> {
    let flowController: FlowControllerType
    init (flowController: FlowControllerType) {
        self.flowController = flowController
    }
}

class ViewController<ViewModelType: ViewModel<FlowController>> {

    var viewModel: ViewModelType!
}

// MARK: - My implementation

class MyFlowController: FlowController {

}

class MyViewModel: ViewModel<MyFlowController> {
    override init (flowController: MyFlowController) {
        super.init(flowController: flowController)
    }
}

// ERROR: 'ViewController' requires that 'MyModelView' inherit from 'ViewModel<FlowController>'
class MyViewController: ViewController<MyViewModel> {

}

// MARK: - Code

let viewController = MyViewController()
viewController.viewModel = MyViewModel(flowController: MyFlowController())

Проблема в том, что я хотел бы объявить MyViewController, но я получаю ошибку:

'ViewController' requires that 'MyModelView' inherit from 'ViewModel<FlowController>'

Вопрос в том, как объявить этиклассы, чтобы это работало?Должен ли я использовать where предложение для этого?Я хочу иметь свои собственные типы для ViewController.viewModel и ViewModel.flowController в базовых классах, сохраняя эти зависимости между классами.Заранее спасибо.

Смежный вопрос: Быстрое наследование

1 Ответ

0 голосов
/ 29 ноября 2018

Я, наверное, отвечу, но это может выглядеть лучше, чем это решение.Уловка в следующей строке

class ViewController<FlowControllerType: FlowController, ViewModelType: ViewModel<FlowControllerType>> {

, которую следует использовать вместо

class ViewController<ViewModelType: ViewModel<FlowController>> {

Я надеюсь, что кто-то другой сделает это лучше, но пока только это работает.Пример полной игровой площадки:

import UIKit

// MARK: - Base classes with generics

class FlowController {

}

class ViewModel<FlowControllerType: FlowController> {
    let flowController: FlowControllerType
    init (flowController: FlowControllerType) {
        self.flowController = flowController
    }
}

class ViewController<FlowControllerType: FlowController, ViewModelType: ViewModel<FlowControllerType>> {

    var viewModel: ViewModelType!
}

// MARK: - My implementation

class MyFlowController: FlowController {

}

class MyViewModel: ViewModel<MyFlowController> {
    override init (flowController: MyFlowController) {
        super.init(flowController: flowController)
    }
}

class MyViewController: ViewController<MyFlowController, MyViewModel> {

}

// MARK: - Code

let viewController = MyViewController()
viewController.viewModel = MyViewModel(flowController: MyFlowController())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...