我正在尝试使用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?