簡體   English   中英

使用關聯的類型/類型別名時,類型“ X”不符合協議“ Y”

[英]Type 'X' does not conform to protocol 'Y' when using associatedtype / typealias

我正在嘗試使用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
    }
}

這是一個棘手的情況。 解決方法是更換

associatedtype ViewModel: MVVMViewModel 

associatedtype ViewModel = MVVMViewModel

為什么?

  1. 您將MVVMView描述為具有viewModel屬性的類型,其類型符合MVVMViewModel。 您可以嘗試創建這樣的課程

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

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

    }

您將收到錯誤消息,說MVVMViewModel不符合MVVMViewModel,因此MVVMViewModel不符合自身,因為任何協議都很快

  1. 其實我不知道,但是協議也不符合其父協議。這就是為什么ListViewModelProtocol不符合MVVMViewModel的原因

您可以找到更詳細的解釋,在這里我發現一種協議不符合自身?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM