【Swift】Codableで後からキーを追加した場合の挙動

公開日: : iPhoneアプリ開発

こんにちは、@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としてデコードされる

という挙動になりました。

関連記事

この記事が気に入ったら「いいね!」しよう

follow us in feedly

Feedlyで最新記事を購読

Twitterで更新情報をゲット!

LINEでご感想・ご要望お送りください!
(スマホでLINEを起動 > 友だち追加 > QRコード)

【WWDC2018】iOSエンジニア的に気になる新機能・新APIまとめ

こんにちは、@akio0911です。 先日開催されたWW

【Swift】Codableで後からキーを追加した場合の挙動

こんにちは、@akio0911です。 SwiftのCod

現場での開発の全体像について学べる「現場のためのSwift4 Swift4.1+Xcode9.3対応」

著者の一人である @takashingsさんから、現場のためのSw

Touch Barを使うとショートカットを覚える必要が無くなって便利

こんにちは、@akio0911です。 今年の2月にTouch B

【iOS】X日やX時間などの文字列表現を簡単に作れる DateComponentsFormatter

こんにちは、@akio0911です。 「2018年5月6日」「1

→もっと見る

PAGE TOP ↑