ios - 如何在 Swift 的泛型中声明基类?

标签 ios swift generics mvvm

代码示例不起作用,但我希望它能成功编译。下面的源代码中很好地描述了想法。您可以轻松地将其粘贴到 Swift playground 中。

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.viewModelViewModel.flowController 类型,以保持类之间的这些依赖关系。提前谢谢你。

相关问题: Swift generic inheritance

最佳答案

我可能有答案,但它看起来可能比这个解决方案更好。技巧在下一行

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

应该用哪个代替

class ViewController<ViewModelType: ViewModel<FlowController>> {

我希望其他人会做得更好,但目前只有这个有效。完整的 Playground 示例:

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())

关于ios - 如何在 Swift 的泛型中声明基类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53539605/

相关文章:

Java 泛型和原始类型

swift - 查看 statUpdatingLocation 在 Swift 中是否处于事件状态

ios - Swift 泛型和向上转型

iphone - 加载两种语言的英文版图像

ios - Kotlin 多平台 - 错误 ITMS-90171 : Invalid Bundle Structure

ios - 如何从字符串中获取 NSDate 而不将其转换为 UTC

ssl - 如何在 alamofire 中启用 SSL 连接

java - 使用 'super' 关键字绑定(bind)泛型

iphone - 我们可以在 UITableViewCell 中添加 ScrollView 吗?

ios - 如何从另一个 View Controller 加载webview?