Внедрить протокол с другим типом переменной - PullRequest
1 голос
/ 02 августа 2020

У меня есть протокол с именем ResponseProtocol, который содержит переменную, которая сама является протоколом ResponseModel. Я пытаюсь реализовать это с другим соответствием типу протокола, но я столкнулся с этой ошибкой:

Тип 'FetchUserResponse' не соответствует протоколу 'ResponseProtocol'

protocol ResponseModel { }

protocol ResponseProtocol {
    var response: ResponseModel
}

struct UserModel: ResponseModel {

}

struct FetchUserResponse: ResponseProtocol {
    var response: UserModel
}

мой вопрос: почему я получаю эту ошибку? UserModel это ResponseModel.

мой второй вопрос - как я могу это исправить? спасибо!

Ответы [ 3 ]

0 голосов
/ 02 августа 2020
Протокол

не поддерживает унаследованные переменные вы можете сделать свой ответ var как ResponseModel и использовать его в своем использовании

0 голосов
/ 02 августа 2020

ваш ответ var должен быть ResponseModel

struct FetchUserResponse: ResponseProtocol {
    var response: ResponseModel
}

, но вы можете назначить UserModel для ответа на основе концепции полиморфизма

var object = FetchUserResponse(response: UserModel())
0 голосов
/ 02 августа 2020

Требование протокола: var response: ResponseModel, а не тип, который соответствует протоколу.

Лучше использовать связанный тип

protocol ResponseProtocol {
    associatedtype ResponseType
    var response: ResponseType { get }
}

struct UserModel { }

struct FetchUserResponse: ResponseProtocol {
    typealias ResponseType = UserModel
    var response: UserModel
}
...