Тип 'X' не соответствует протоколу 'Y' при использовании relatedtype / typealias - PullRequest
0 голосов
/ 07 июля 2019

Я пытаюсь добавить некоторые базовые классы в приложение для iOS, используя MVVM, чтобы упростить и реализовать общие классовые отношения.

К сожалению, я сталкиваюсь со следующей проблемой:

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 Ответ

1 голос
/ 07 июля 2019

Это сложный случай.Решение состоит в том, чтобы заменить

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 не соответствует сам по себе, как любой протокол в swift

На самом деле я этого не знал, но протокол также не соответствует его родителю. Поэтому ListViewModelProtocol не соответствует MVVMViewModel

Более подробное объяснение можно найти, здесь я нашел одно Протокол не соответствует самому себе?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...