如何使结构符合swift 4中具有符合另一协议的属性的协议?
我打算将web服务中的一些JSON数据反映到swift结构中。所以我创建了一个符合可解码协议的协议,并计划创建一些结构来符合它。这是我创建的协议:如何使结构符合swift 4中具有符合另一协议的属性的协议?,swift,protocols,decodable,Swift,Protocols,Decodable,我打算将web服务中的一些JSON数据反映到swift结构中。所以我创建了一个符合可解码协议的协议,并计划创建一些结构来符合它。这是我创建的协议: protocol XFNovelApiResponse: Decodable { var data: Decodable {get} var error: NovelApiError {get} } struct NovelApiError: Decodable { let msg: String let errorCo
protocol XFNovelApiResponse: Decodable {
var data: Decodable {get}
var error: NovelApiError {get}
}
struct NovelApiError: Decodable {
let msg: String
let errorCode: String
}
它是汇编的。但是当我开始写我的结构时,我犯了一个错误。结构的代码如下所示:
struct XFNovelGetNovelsApiResponse: XFNovelApiResponse {
let data: NovelsData
let error: NovelApiError
struct NovelsData: Decodable {
}
}
错误显示类型“XFNovelGetNovelsApiResponse”不符合协议“xfNovelAppResponse”。我知道“数据”属性应该以错误的方式实现。我怎样才能修好它?谢谢。您要求描述的是
数据可以保存的类型,而不是实际类型。这意味着它需要是一个关联类型
:
protocol XFNovelApiResponse: Decodable {
associatedtype DataType: Decodable
var data: DataType {get}
var error: NovelApiError {get}
}
注意,关联类型的协议会产生很多复杂性,因此您应该仔细考虑该协议是否真的必要,或者如果<代码> XFNovelApiResponse <代码>可以是通用的。这取决于实现此协议的其他类型
例如,没有协议的一组类似数据结构的另一个实现是:
struct XFNovelApiResponse<DataType: Decodable>: Decodable {
var data: DataType
var error: NovelApiError
}
struct NovelsData: Decodable {
}
struct NovelApiError: Decodable {
let msg: String
let errorCode: String
}
let novels = XFNovelApiResponse(data: NovelsData(),
error: NovelApiError(msg: "", errorCode: ""))
struct xfNovelapirResponse:可解码{
变量数据:数据类型
变量错误:NovelApiError
}
结构NovelsData:可解码{
}
结构Novelapier错误:可解码{
让msg:String
让错误代码:String
}
让小说=xFnovelapirResponse(数据:NovelsData(),
错误:NovelApiError(消息:“”,错误代码:“”)
或者,您可以使用允许继承的类和子类来实现这一点。结构不是从协议继承的,它们符合协议。如果你真的是指继承,那么类是正确的工具。(但我认为泛型是更好的解决方案。)