如何使包含元组的字典符合可编码?

How to make a dictionary containing a tuple conform to codable?

我已经在这里看到许多其他与我类似的问题,但我无法找到我的案例 - 如果我遗漏了一些明显的问题,我深表歉意!

我有一个 'Transaction' class,其中包含一些属性,所有这些属性都符合可编码并且 saving/loading 很好。我刚刚添加了一个字典并收到以下错误:Type 'Transaction' does not conform to protocol 'Decodable' and 'Encodable'.

字典是:

var splitTransaction: [String:(amount: Money<GBP>, setByUser: Bool)]? {

Money 的来源:https://github.com/Flight-School/Money(Money 已经符合 codable,我还有其他类型的 Money 属性运行良好。

来自 https://developer.apple.com/documentation/foundation/archives_and_serialization/encoding_and_decoding_custom_types 我想我必须使用 Coding Keys 来 encode/decode splitTransaction,但这是否意味着我也必须为我的每个其他属性都有一个 Coding Key?然后提供一种方法 encode/decode 他们呢?或者有没有办法自动保留所有其他属性 encoding/decoding,而只是提供一种让 splitTransaction 手动工作的方法。

非常感谢任何指导!

问题是您 Dictionary 中的值是 Tuple 并且元组不符合 Codable。遗憾的是,您甚至不能扩展 Tuple,因为它们是 non-nominal 类型,因此您必须切换到另一种数据类型或自己实现编码和解码方法。

我建议使用自定义 struct 而不是元组,例如

struct TransactionAmount<Currency>: Codable {
    let amount: Money<Currency>
    let setByUser: Bool
}

然后在你的 Transaction class,

var splitTransaction: [String:TransactionAmount<GBP>]? {...