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

公開日: : iOSアプリ開発

記事内に広告を含む場合があります。記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。

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

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

この記事を書いた人
あきお(@akio0911
派手髪iOSエンジニア。Twitterアカウントは@akio0911。YouTubeチャンネル「あきおチャンネル」にてiOSアプリ開発講座を公開中。著書に「iPhoneアプリ開発レシピ」「cocos2d for iPhoneレッスンノート」など。iOSアプリ開発をテーマとしたオンラインサロン「アプリ道場サロン」を運営。東京・大阪にてアプリ開発講座「アプリクリエイター道場」を主催。

関連記事

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

Twitterで更新情報をゲット!

PAGE TOP ↑