【Swift】Codableで後からキーを追加した場合の挙動
記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
こんにちは、@akio0911です。
SwiftのCodableで後からキーを追加した場合の挙動についてメモっておこうと思います。
旧バージョンでJSONを出力する
まずはnameプロパティだけを持つPersonというstructを作り、そのインスタンスをJSON形式にエンコードしてみます。
struct Person: Codable { let name: String } do { let person = Person(name: "akio") let data = try JSONEncoder().encode(person) let json = String(data: data, encoding: .utf8)! print(json) } catch { print(error.localizedDescription) }
実行結果は以下のようになります。
{"name":"akio"}
新バージョンでデコードしてみる(非オプショナル)
Personにプロパティage(非オプショナルのInt)を追加し、先ほどエンコードしたJSONを読み込んでみます。
struct Person: Codable { let name: String let age: Int } do { let json = """ {"name": "akio"} """ let data = json.data(using: .utf8)! let person = try JSONDecoder().decode(Person.self, from: data) print(person) } catch { print(error.localizedDescription) }
実行結果は以下の通り。JSONの中にageというキーが無いため、エラーとなっています。
The data couldn’t be read because it is missing.
新バージョンでデコードしてみる(オプショナル)
PersonのプロパティageをオプショナルのIntに変更し、先ほどと同じJSONを読み込んでみます。
struct Person: Codable { let name: String let age: Int? } do { let json = """ {"name": "akio"} """ let data = json.data(using: .utf8)! let person = try JSONDecoder().decode(Person.self, from: data) print(person) } catch { print(error.localizedDescription) }
実行結果は以下の通り。今回はエラーになりませんでしたが、ageの値はnilとなっています。
Person(name: "akio", age: nil)
まとめ
Codableに適合している型に後から新たなプロパティを追加した場合、デコード対象のJSONに対応するキーが存在しなかった時に、
- 追加したプロパティが非オプショナルだった場合、エラーとなる
- 追加したプロパティがオプショナルだった場合、対応する値はnilとしてデコードされる
という挙動になりました。
関連記事
この記事が気に入ったら「いいね!」しよう
Twitterで更新情報をゲット!