I'm looking to store models objects in a Dictionary and would like to serialize the whole dictionary using JSONEncoder
into data and subsequently into a string and save it.
The idea is to use Swift 4's out of the box Encodable
to ensure anything that I add to the dictionary will be serialized which can include primitives and custom objects (which will themselves conform to Encodable
).
The Challenge is what type should I declare the dictionary to be:
- If I use
[String: Any]
, it won't know how to encode Any
, and if I have to cast it into an actual concrete type, it kind of defeats the purpose of generics
- If I use
[String: Encodable]
, it will crash at run time saying
Encodable doesn't conform to itself, which is understandable as it
needs a concrete type
In order to tackle this, I thought of creating a wrapper:
i.e A protocol with an associated type or a struct with generic type value:
struct Serializable<T: Encodable> {
var value: T?
init(value: T) {
self.value = value
}
}
But the problem remains, while declaring the type of the aforementioned dictionary, I still have to supply the concrete type..
var dictionary: [String: Serializable<X>]
What should 'X' be here, Or, what's the correct way to achieve this?
What am I missing?
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…