【问题标题】:Implement protocol with different variable type实现具有不同变量类型的协议
【发布时间】:2020-08-02 10:13:10
【问题描述】:
我有一个名为 ResponseProtocol 的协议,其中包含一个本身就是协议 ResponseModel 的变量。
我正在尝试使用不同的符合协议类型来实现它,但我遇到了这个错误:
类型“FetchUserResponse”不符合协议
'响应协议'
protocol ResponseModel { }
protocol ResponseProtocol {
var response: ResponseModel
}
struct UserModel: ResponseModel {
}
struct FetchUserResponse: ResponseProtocol {
var response: UserModel
}
我的问题是,为什么会出现此错误?
UserModel 是一个 ResponseModel。
我的第二个问题 - 我该如何解决?谢谢!
【问题讨论】:
标签:
swift
protocols
swift-protocols
【解决方案1】:
协议要求是var response: ResponseModel,不是符合协议的类型。
更好的方法是关联类型
protocol ResponseProtocol {
associatedtype ResponseType
var response: ResponseType { get }
}
struct UserModel { }
struct FetchUserResponse: ResponseProtocol {
typealias ResponseType = UserModel
var response: UserModel
}
【解决方案2】:
协议不支持继承变量
您可以将您的 var 响应作为 ResponseModel 并将其转换为您的使用
【解决方案3】:
您的响应变量需要是 ResponseModel
struct FetchUserResponse: ResponseProtocol {
var response: ResponseModel
}
但您可以根据多态性概念将 UserModel 分配给响应
var object = FetchUserResponse(response: UserModel())