ios - 如何确保相同的继承层次结构,例如对于 MVVM

标签 ios swift inheritance hierarchy

我有一个基本的 ViewController 和一个基本的 ViewModel。基础 ViewModel 由基础 ViewController 使用。此外,我有 2 个 ViewController 子类和 2 个 ViewModel 子类需要一起使用。

例子:

class BaseViewModel {
    func somethingBasic() {}
}

class ConcreteViewModel1: BaseViewModel {
    func somethingConcrete1() {}
}

class ConcreteViewModel2: BaseViewModel {
    func somethingConcrete2() {}
}

class BaseViewController {
    let viewModel: BaseViewModel

    init(with viewModel: BaseViewModel) {
        self.viewModel = viewModel
    }
}

class ConcreteViewController1: BaseViewController {
    init(with viewModel: ConcreteViewModel1) {
        super.init(with: viewModel)
    }

    func useViewModel() {
        viewModel.somethingBasic()
        viewModel.somethingConcrete1() //this does not work
    }
}

class ConcreteViewController2: BaseViewController {
    init(with viewModel: ConcreteViewModel2) {
        super.init(with: viewModel)
    }

    func useViewModel() {
        viewModel.somethingBasic()
        viewModel.somethingConcrete2() //this does not work
    }
}

问题是:使 viewmodel.somethingConcrete1()viewmodel.somethingConcrete2() 工作的首选解决方案是什么?

最佳答案

为此尝试使用Generics

BaseViewController 中创建 init 接受一个 generic parameter T constrained to type BaseViewModel,即

class BaseViewController<T: BaseViewModel> {
    let viewModel: T

    init(with viewModel: T) {
        self.viewModel = viewModel
    }
}

现在从 BaseViewController 继承 ConcreteViewController1ConcreteViewController2通用参数 T,即

class ConcreteViewController1: BaseViewController<ConcreteViewModel1> {
    func useViewModel() {
        viewModel.somethingBasic()
        viewModel.somethingConcrete1()
    }
}

class ConcreteViewController2: BaseViewController<ConcreteViewModel2> {
    func useViewModel() {
        viewModel.somethingBasic()
        viewModel.somethingConcrete2()
    }
}

关于ios - 如何确保相同的继承层次结构,例如对于 MVVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57322027/

相关文章:

ios - 如何在 Swift3 中将事件添加到我的 CustomCell

ios - 使用 swift 进行场景套件内存管理

ios - 分机上的 "Undefined symbols for architecture arm64"

css - 两个连续调用的样式表中的第二个能否覆盖第一个中定义的所有样式?

ios - 反转音频文件 Swift/Objective-C

ios - CGSize 和 CGRect 的区别

ios 有条件地关闭 facebook sdk

objective-c - 苹果应用拒绝原因

c++ - “double& Point::operator[](unsigned int)”在此上下文中不可访问

javascript - 访问派生类中使用 Wea​​kMap 定义的私有(private)变量