使用关联的类型/类型别名时,类型“ X”不符合协议“ Y”

时间:2019-07-07 07:00:40

标签: ios swift mvvm

我正在尝试使用MVVM向iOS应用添加一些基类,以使其更容易并强制建立通用的类关系。

可悲的是,我遇到了以下问题:

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

我不确定为什么会发生这种情况,并且破坏了我“强制”代码进入该体系结构的想法。有什么明显的我想念的东西吗?我是否有解决方法来解决此问题并保留“强制”体系结构?

注意:我正在使用Swift 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
    }
}

1 个答案:

答案 0 :(得分:1)

这是一个棘手的情况。 解决方法是更换

associatedtype ViewModel: MVVMViewModel 

associatedtype ViewModel = MVVMViewModel

为什么?

  1. 您将MVVMView描述为具有viewModel属性的类型,其类型符合MVVMViewModel。您可以尝试创建这样的类

    AnyView类:MVVMView {     typealias ViewModel = MVVMViewModel     var viewModel:MVVMViewModel

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

    }

您将收到错误消息,说MVVMViewModel不符合MVVMViewModel 因此,MVVMViewModel不符合任何快速协议

  1. 实际上我不知道这一点,但是协议也不符合其父协议 这就是为什么ListViewModelProtocol不符合MVVMViewModel

您可以找到更详细的解释,在这里我找到了一个 Protocol doesn't conform to itself?