gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 08:28:20 25 4
gpt4 key购买 nike

我打算将 Web 服务中的一些 JSON 数据反射(reflect)到 swift 结构中。所以我创建了一个符合可解码协议(protocol)的协议(protocol),并计划创建一些结构来符合它。这是我创建的协议(protocol):

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

最佳答案

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

protocol XFNovelApiResponse: Decodable {
associatedtype DataType: Decodable
var data: DataType {get}
var error: NovelApiError {get}
}

请注意,具有关联类型的协议(protocol)会产生很多复杂性,因此您应该仔细考虑此协议(protocol)是否真的有必要,或者 XFNovelApiResponse 是否可以改为通用。这取决于其他什么类型实现了这个协议(protocol)。

例如,没有协议(protocol)的一组类似数据结构的另一种实现是:

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

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

关于swift - 如何使结构符合具有属性的协议(protocol)符合 swift 4 中的另一个协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52286636/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com