【问题标题】:Can not override a variable in Swift不能覆盖 Swift 中的变量
【发布时间】:2019-08-27 03:11:31
【问题描述】:

例如,我为我的项目的所有视图创建了基类,使用 MVVM 模式,它还没有任何问题。

class BaseView: UIView {
    var viewModel: ViewModelProtocol

    init(viewModel: ViewModelProtocol) {
        self.viewModel = viewModel

        super.init(frame: .zero)
    }
}


protocol ViewModelProtocol {
}

class BaseViewModel: ViewModelProtocol {
}

但是,如果我创建一个从父类(BaseView) 继承的子类(CustomView) 并且它必须有一个单独的 ViewModel(CustomViewModel),我将在@987654327 处收到错误Property 'viewModel' with type 'CustomViewModel' cannot override a property with type 'ViewModelProtocol' @线。

final class CustomView: BaseView {
    override var viewModel: CustomViewModel
}


final class CustomViewModel: BaseViewModel {
    var name: String

    init(name: String) {
        self.name = name

        super.init()
    }
}

如何满足以下条件?

  1. 每个自定义视图都应该继承BaseView
  2. BaseView 应该有 BaseViewModel
  3. 每个自定义视图都可以有一个继承自 BaseViewModel 的自定义视图模型。

【问题讨论】:

标签: ios swift oop mvvm


【解决方案1】:

我建议让BaseView 接受通用ViewModel 如下所示,这样您就不需要overrideviewModel 属性,并且您的viewModel 将始终是从@ 继承时提供的相同自定义类型987654326@.

class BaseView<ViewModel: ViewModelProtocol>: UIView {
    var viewModel: ViewModel

    init(viewModel: ViewModel) {
        self.viewModel = viewModel

        super.init(frame: .zero)
    }
}

final class CustomView: BaseView<CustomViewModel> {

     // viewModel is of type  'CustomViewModel'
}

【讨论】:

    猜你喜欢
    • 2014-11-29
    • 2017-01-08
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 2019-04-20
    相关资源
    最近更新 更多