如何使结构符合具有属性符合 swift 4 中另一个协议的协议?



我打算将一些来自Web服务的JSON数据反映到swift结构中。因此,我创建了一个符合可解码协议的协议,并计划创建一些结构来符合它。这是我创建的协议:

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"不符合协议"XFNovelApiResponse"。我知道"数据"属性应该以错误的方式实现。我该如何解决它?谢谢。

您要求描述data可以容纳的类型,而不是实际类型。这意味着它需要是一个associatedtype

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: ""))

或者,您可以使用允许继承的类和子类来实现这一点。结构不继承自协议,它们符合协议。如果你真的是指继承,类是正确的工具。(但我希望泛型是更好的解决方案。

最新更新