swift - 解码一个带有额外 Codable 属性的包装 Codable 类型的 Swift 类型
问题描述
我有一个 Codable 类型,比方说Car
,它定义为:
struct Car: Codable {
let age: Int
let color: String
}
我可以很好地编码/解码这个。
使用我的持久性系统,当一个对象被存储时,它会被分配一个_id
属性,即 a 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)
}
}
推荐阅读
- arm - ARM 通用定时器模拟
- c# - C#在类之间传递对象为null
- webview - Tizen 本机 Web 视图:如何在本机 Web 视图中存储和恢复 cookie?
- android - 如何使 android 活动适合所有尺寸的移动显示器?
- sql-server - 如何在 SQL Server 中汇总按重叠时间分组的持续时间
- python - 正则表达式使用不正确的日文字符返回 true
- azure - Azure 中托管的 Kentico 站点中的会话状态问题
- sql - 使用参数更快地进行 T-Sql 查询
- ios - 如何在 IOS 中集成 webRTC 视频通话?
- oracle - Rownum 无法正常工作