gpt4 book ai didi

swift - 解码一个 Swift 类型,它是一个带有额外 Codable 属性的包装 Codable 类型

转载 作者:行者123 更新时间:2023-11-28 13:44:19 25 4
gpt4 key购买 nike

我有一个 Codable 类型,比方说 Car ,它被定义为:

struct Car: Codable {
let age: Int
let color: String
}

我可以很好地编码/解码它。

在我的持久化系统中,当一个对象被存储时,它会被分配一个 _id 属性,它是一个 String ,例如5cae04b533376609456d40ed .

因此,当我从持久存储中读取 Data 然后尝试对其进行解码时,其中有额外的字节表示 _id 属性及其关联的 String 值。

我无法控制商店中可以编码和存储的各种类型。对它们的唯一限制是它们是 Codable

我希望能够做的是将我从商店读取时获得的 Data 解码(包括 _id 的东西)为类似于 Wrapped<T: Codable> 的类型,它将被定义为类似(最简单的形式):

struct Wrapped<T: Codable> {
let _id: String
let value: T
}

但是,我不确定是否要这样做。

我所做的一次尝试是定义一个自定义 decode 函数,但这并没有走得太远,因为我似乎无法访问 T 类型的 CodingKeys ,据我所知,这使得事情变得不可能方法。

也许有另一种方法可以让事情如我所愿?

最佳答案

您可以为您的 Wrapped 类型编写自定义解码函数,解析出 _id,然后将解码器传递给包装类型,以便它可以解码自己的属性:

struct Wrapped<T: Codable>: Decodable {
let _id: String
let value: T

private enum CodingKeys: String, CodingKey {
case _id
}

init(from decoder: Decoder) throws {
let container = try decoder.container(keyedBy: CodingKeys.self)

_id = try container.decode(String.self, forKey: ._id)
value = try T(from: decoder)
}
}

关于swift - 解码一个 Swift 类型,它是一个带有额外 Codable 属性的包装 Codable 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55616169/

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