我正在尝试使用MVVM将一些基类添加到iOS应用程序中,以使其更容易并强制实现公共类关系。
很遗憾,我遇到了以下问题:

error: MyPlayground.playground:27:7: error: type 'ListView' does not
conform to protocol 'MVVMView'
class ListView: MVVMView {

我不知道为什么会发生这种情况,我的想法“强迫”我的代码进入这个架构。我有什么明显的缺失吗?我有没有办法解决这个问题并保持“强制”体系结构?
注:我用的是斯威夫特5。
/**
 Base classes for MVVM
 */
protocol MVVMViewModel {

}

protocol MVVMView {
    associatedtype ViewModel: MVVMViewModel
    var viewModel: ViewModel { get }
}

/**
 Simple viewmodel, only used by protocol so it can be replaced when testing
 */
protocol ListViewModelProtocol: MVVMViewModel {

}

class ListViewModel: ListViewModelProtocol {

}

/*
 Simple view
 */
class ListView: MVVMView {
    typealias ViewModel = ListViewModelProtocol
    var viewModel: ListViewModelProtocol

    init(viewModel: ListViewModelProtocol) {
        self.viewModel = viewModel
    }
}

最佳答案

这是个棘手的案子。
解决办法是

associatedtype ViewModel: MVVMViewModel

具有
associatedtype ViewModel = MVVMViewModel

为什么?
您将MVVMView描述为具有类型符合MVVMViewModel的viewModel属性。你可以尝试创建这样的类
类AnyView:MVVMView{
typealias ViewModel=MVVMViewModel
var视图模型:MVVMViewModel
init(viewModel: MVVMViewModel) {
    self.viewModel = viewModel
}

}
会出现错误,说MVVMViewModel不符合MVVMViewModel
因此MVVMViewModel不符合swift中的任何协议
其实我不知道,但是协议也不符合它的父协议
这就是ListViewModelProtocol不符合MVVMViewModel的原因
你可以找到更详细的解释,这里我找到了一个
Protocol doesn't conform to itself?

09-25 18:44