gpt4 book ai didi

ios - 使用 associatedtype/typealias 时类型 'X' 不符合协议(protocol) 'Y'

转载 作者:行者123 更新时间:2023-11-28 13:34:04 25 4
gpt4 key购买 nike

我正在尝试使用 MVVM 向 iOS 应用程序添加一些基类,以使其更容易并强制执行公共(public)类关系。

遗憾的是,我遇到了以下问题:

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
}
}

最佳答案

这是一个棘手的案例。解决方法是更换

associatedtype ViewModel: MVVMViewModel 

associatedtype ViewModel = MVVMViewModel

为什么?

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

    AnyView 类:MVVMView { typealias ViewModel = MVVMViewModel 变种 View 模型:MVVMViewModel

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

你会报错,说 MVVMViewModel does not conform to MVVMViewModel所以 MVVMViewModel 不符合自身作为 swift 中的任何协议(protocol)

  1. 其实我不知道这个,但是协议(protocol)也不符合它的父协议(protocol)这就是为什么 ListViewModelProtocol 不符合 MVVMViewModel

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

关于ios - 使用 associatedtype/typealias 时类型 'X' 不符合协议(protocol) 'Y',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56920020/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com