CodableProxies

CodableProxies 为 Swift 的 Codable 类型提供了强大的编码和解码策略。 通过将你的编码器和解码器包装在 DecoderProxyEncoderProxy 中,你可以轻松应用这些策略,从而获得更灵活和通用的编码/解码体验。

特性

用法

示例

struct User: Codable {
    let isActive: Bool
    let birthDate: Date
    ...
}

let userJSON = """
{
    "isActive": "yes",
    "birthDate": "1990-01-01T00:00:00Z",
    ...
}
"""

let decoder = DecoderProxy(JSONDecoder(), strategy: [.default, .Bool.string, .Date.iso8601])
let user = try decoder.decode(User.self, from: userJSON.data(using: .utf8)!)

初始化

包装你的编码器和解码器

let encoder = EncoderProxy(JSONEncoder(), strategy: [.Bool.string, .Date.iso8601])
let decoder = DecoderProxy(JSONDecoder(), strategy: [.Bool.string, .Date.iso8601])

可用策略

完整列表

联合类型

该库提供了 CodingProxyCodingStrategy,它们将编码和解码结合在一起,以实现对称操作。

📝 组合编码和解码策略

设置多个策略时,编码和解码之间的行为有所不同

编码

如果为同一类型组合了多个编码策略,则只会应用最后指定的策略。 较早指定的策略将被覆盖。

示例: 使用 [.Date.iso8601, .Date.timestamp] 进行编码将导致日期被编码为时间戳,因为 .Date.timestamp 是最后列出的策略。

解码

对于解码,如果为同一类型指定了多个策略,将按提供的顺序尝试所有策略。 如果任何策略成功,解码都将成功。 如果所有自定义策略都失败,则解码器的原始策略将用作回退。

示例: 对于 [.Date.iso8601, .Date.timestamp] 的解码,代理将首先尝试以 ISO8601 格式解码日期。 如果失败,它将尝试将其解码为时间戳。 如果两种策略都失败,则将使用解码器的原始策略解码日期。

⚠️关于自定义类型编码/解码的重要提示

使用 CodableProxies 时,必须了解该库将覆盖并忽略原始编码器/解码器上设置的任何自定义编码和解码策略。 此行为特别影响与 JSONEncoderJSONDecoderPropertyListEncoderPropertyListDecoder 一起使用时的以下类型

为了保持一致性并避免意外结果,请始终在代理编码器/解码器中包含这些类型的策略。 方便的是,所有这些策略都捆绑在 EncoderStrategy.defaultDecoderStrategy.default 中。

即将推出的增强功能

安装

  1. Swift 包管理器

创建一个 Package.swift 文件。

// swift-tools-version:5.7
import PackageDescription

let package = Package(
  name: "SomeProject",
  dependencies: [
    .package(url: "https://github.com/dankinsoid/CodableProxies.git", from: "1.1.3")
  ],
  targets: [
    .target(name: "SomeProject", dependencies: ["CodableProxies"])
  ]
)
$ swift build

作者

dankinsoid, voidilov@gmail.com

许可证

CodableProxies 在 MIT 许可证下可用。 有关更多信息,请参见 LICENSE 文件。

贡献

始终欢迎贡献! 请参阅我们的贡献指南。