私は値の配列とJSONを持っている:タイプがタグに依存する値の配列をデコードするには?
[
{ "tag": "Foo", … },
{ "tag": "Bar", … },
{ "tag": "Baz", … },
]
私は、特定のタイプは、タグによって異なりstruct
の配列にこの配列を解読したい:
protocol SomeCommonType {}
struct Foo: Decodable, SomeCommonType { … }
struct Bar: Decodable, SomeCommonType { … }
struct Baz: Decodable, SomeCommonType { … }
let values = try JSONDecoder().decode([SomeCommonType].self, from: …)
それを行う?その後、
struct DecodingWrapper: Decodable {
let value: SomeCommonType
public init(from decoder: Decoder) throws {
let c = try decoder.singleValueContainer()
if let decoded = try? c.decode(Foo.self) {
value = decoded
} else if let decoded = try? c.decode(Bar.self) {
value = decoded
} else if let decoded = try? c.decode(Baz.self) {
value = decoded
} else {
throw …
}
}
}
そして:現時点では私はこの少し醜いラッパーを持って
let wrapped = try JSONDecoder().decode([DecodingWrapper].self, from: …)
let values = wrapped.map { $0.value }
は、より良い方法はありますか?
私はあなたがいないだと仮定していますそのjsonを送る人。私が考えることのできる唯一の他の方法は、文字列から辞書を辞書に格納しておき、タグが辞書内にあるかどうかを確認し、対応する型を取得してそこからオブジェクトを初期化することです。 (私はいくつか細かい詳細を除外しましたが、あなたは主なアイデアを得ると思います)。 – TNguyen
https:// stackoverflowの2番目の部分を比較してください。もう一つのアプローチのためのcom/a/44473156/2976878(あなたがそれをより良く考えているかどうかわからない、まだラッパータイプを使用しています) – Hamish
@Hamish、その質問は私が後にしているものなので、賞金の期限が切れた後に詐欺師として。ありがとうございました! – zoul