我希望将模型对象存储在 Dictionary 中,并希望将整个字典序列JSONEncoder
化为数据,然后将其序列化为字符串并保存。
这个想法是使用 Swift 4 开箱即用Encodable
,以确保我添加到字典中的任何内容都将被序列化,其中可以包括原语和自定义对象(它们本身将符合Encodable
)。
挑战是我应该将字典声明为什么类型:
- 如果我使用
[String: Any]
,它将不知道如何编码Any
,并且如果我必须将其转换为实际的具体类型,这有点违背泛型的目的 - 如果我使用
[String: Encodable]
,它会在运行时崩溃,说 Encodable 不符合自身,这是可以理解的,因为它需要一个具体的类型
为了解决这个问题,我想到了创建一个包装器:即具有关联类型的协议或具有泛型类型值的结构:
struct Serializable<T: Encodable> {
var value: T?
init(value: T) {
self.value = value
}
}
但是问题仍然存在,在声明上述字典的类型时,我仍然必须提供具体类型..
var dictionary: [String: Serializable<X>]
“X”应该在这里,或者,实现这一目标的正确方法是什么?我错过了什么?