gpt4 book ai didi

具有枚举属性的协议(protocol)中的 Swift 4 Codable

转载 作者:搜寻专家 更新时间:2023-11-01 06:30:51 24 4
gpt4 key购买 nike

我有这个协议(protocol),

protocol PaginableItem {
var resultType: ResultType { get set }
}

具有枚举类型的单个属性,

enum ResultType: String, Codable {
case photo = "PHOTO"
case baseItem = "BASEITEM"
case new = "NEW"
}

我还有 3 个不同的结构和类符合 PaginableItem 和一个类有一些 PaginableItems,

final class TimelineModel: Codable {
let stream: String
let participants: String
let header1: PaginableList
let header2: PaginableList
let items: PaginableList
}

final class PaginableList: Codable {
let data: [PaginableItem]
let pagination: Pagination
}

我正在尝试使用 Swift 4 Codable 缓存 TimelineModel,但我不确定这样做的最佳方式。 Xcode 提示 PaginableItem 不符合 Codable

是否必须在ResultType中实现init(from decoder: Decoder) throwsencode(to encoder: Encoder) throws?

PaginableItem 也必须实现 Codable 吗?

最佳答案

PaginableItem 不能符合 Codable 是因为 Swift 协议(protocol)不能符合它们自己。

来源:

Protocol doesn't conform to itself?

Encode/Decode Array of Types conforming to protocol with JSONEncoder

按照上面的第二个链接,如果你想编码/解码一个 PaginableItem,你必须在 AnyPaginableItem 类/结构中键入删除它们并使其符合 可编码/可解码。我是这样做的:

protocol PaginableItem {
var resultType: ResultType { get set }
}

class AnyPaginableItem: Codable {
var resultType: ResultType

init(resultType: ResultType) {
self.resultType = resultType
}
}

enum ResultType: String, Codable {
case photo = "PHOTO"
case baseItem = "BASEITEM"
case new = "NEW"
}

struct ContainsPaginableItem: Codable {
let paginableItem: AnyPaginableItem
}

let paginableItem = AnyPaginableItem(resultType: .photo)
let itemToEncode = ContainsPaginableItem(paginableItem: paginableItem)

let jsonEncoder = JSONEncoder()
let jsonData = try jsonEncoder.encode(itemToEncode)
let jsonString = String(data: jsonData, encoding: .utf8)

此示例仅对可以在 PaginableItem 中声明的属性进行编码,我认为这就是您所需要的。

如果您需要对符合 PaginableItem 的类型的所有属性进行编码,您可以采用上面第二个链接中的更长的解决方案。

关于具有枚举属性的协议(protocol)中的 Swift 4 Codable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47579687/

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