モデルオブジェクトをディクショナリに保存しようとしていて、ディクショナリ全体を使用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' は何であるべきですか? または、これを達成する正しい方法は何ですか? 私は何が欠けていますか?