Swift - 覆盖默认值 encoding/decoding

Swift - Override default encoding/decoding

CGSize 默认编码为数组。我想将其编码为 [String: Float](即 ["width": 10, "height": 20])。有没有办法覆盖默认的 encoding/decoding 行为?当然,作为解决方法,我可以定义自己的 Dimension 类型并使用它。我只是想知道。

没有受支持的方法可以完全覆盖您不拥有的给定类型的编码格式;您可以应用一些 hack 来覆盖您自己的模块中的某些类型,但它们很脆弱,不值得使用。

如果您使用的第 3 方 encoder/decoder 组合不是 Foundation.JSONEncoder/Foundation.JSONDecoder,它可能会提供类似于 encoding/decoding 支持的策略的覆盖工具基础,但这取决于您使用的工具。

执行此操作的“官方”方法是将 CGSize 包装在您拥有的类型中(如您建议的那样)并在那里实现 init(from:)/encode(to:),或者为所有使用 CGSize 的类型覆盖 init(from:)/encode(to:)(但这可能会变得非常乏味)。