名前変更のためのCodingKeys
異なるJSON名とプロパティ名を対応付けます。
「名前変更のためのCodingKeys」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。
キーを名前変更する理由
JSON APIでは、Swiftのプロパティ名と異なる名前が使われることがよくあります。たとえば first_name と firstName です。CodingKeys 列挙型を使うと、モデルのAPIを変更せずに両者を橋渡しできます。
import Foundation
struct User: Codable {
var firstName: String
enum CodingKeys: String, CodingKey {
case firstName = "first_name"
}
}
print("CodingKeys maps firstName to first_name")CodingKeys の構成
CodingKeys は、String, CodingKey に適合するネストされた列挙型です。各caseがプロパティ名に対応し、そのraw valueが使用するJSONキーになります。
import Foundation
struct Product: Codable {
var productName: String
var unitPrice: Double
enum CodingKeys: String, CodingKey {
case productName = "product_name"
case unitPrice = "unit_price"
}
}
print(Product.CodingKeys.productName.rawValue)名前を変更したキーによるデコード
デコード時、デコーダーは CodingKeys のraw valueを使って各プロパティを検索します。そのため、snake_caseのJSONからcamelCaseのプロパティに値を設定できます。
import Foundation
struct User: Codable {
var firstName: String
enum CodingKeys: String, CodingKey {
case firstName = "first_name"
}
}
let json = "{\"first_name\":\"Ada\"}"
let u = try JSONDecoder().decode(User.self, from: json.data(using: .utf8)!)
print(u.firstName)名前を変更したキーによるエンコード
エンコードでは同じ対応関係を逆方向に使用します。出力されるJSONには、Swiftのプロパティ名ではなくraw valueのキーが含まれます。
import Foundation
struct User: Codable {
var firstName: String
enum CodingKeys: String, CodingKey {
case firstName = "first_name"
}
}
let data = try JSONEncoder().encode(User(firstName: "Ada"))
print(String(data: data, encoding: .utf8)!)すべてのプロパティの一覧化
CodingKeys 列挙型を追加したら、エンコードまたはデコードしたいすべてのプロパティに対応するcaseを含める必要があります。raw valueなしで残したcaseでは、プロパティ名がそのまま使われます。
import Foundation
struct Item: Codable {
var id: Int
var displayName: String
enum CodingKeys: String, CodingKey {
case id
case displayName = "display_name"
}
}
let data = try JSONEncoder().encode(Item(id: 1, displayName: "Pen"))
print(String(data: data, encoding: .utf8)!)プロパティの省略
プロパティを CodingKeys から除外すると、エンコードとデコードの対象から外れます。そのようなプロパティにはデフォルト値が必要です。そうしないと、合成されたinitで型を構築できません。
import Foundation
struct User: Codable {
var name: String
var cachedToken: String = "none"
enum CodingKeys: String, CodingKey {
case name
}
}
let u = try JSONDecoder().decode(User.self, from: "{\"name\":\"Ada\"}".data(using: .utf8)!)
print(u.name, u.cachedToken)複数のキーの名前変更
必要な数だけキーを対応付けられます。各caseで、Swiftのプロパティとサーバーが期待する正確なJSONキーを対応させます。
import Foundation
struct Account: Codable {
var userId: Int
var isVerified: Bool
enum CodingKeys: String, CodingKey {
case userId = "user_id"
case isVerified = "is_verified"
}
}
let json = "{\"user_id\":7,\"is_verified\":true}"
let a = try JSONDecoder().decode(Account.self, from: json.data(using: .utf8)!)
print(a.userId, a.isVerified)わかりやすい名前への対応付け
CodingKeys はsnake_caseのためだけのものではありません。わかりにくいAPIキーを、意味の明確なSwiftのプロパティ名に変更するためにも使えます。
import Foundation
struct Reading: Codable {
var temperature: Double
enum CodingKeys: String, CodingKey {
case temperature = "t"
}
}
let json = "{\"t\":19.5}"
let r = try JSONDecoder().decode(Reading.self, from: json.data(using: .utf8)!)
print(r.temperature)ネストされた型での CodingKeys
各 Codable 型には独自の CodingKeys があります。ネストされた構造体は、親とは関係なく自分のキーの名前を変更できます。
import Foundation
struct Meta: Codable {
var createdAt: String
enum CodingKeys: String, CodingKey { case createdAt = "created_at" }
}
struct Doc: Codable { var title: String; var meta: Meta }
let json = "{\"title\":\"A\",\"meta\":{\"created_at\":\"today\"}}"
let d = try JSONDecoder().decode(Doc.self, from: json.data(using: .utf8)!)
print(d.meta.createdAt)名前を変更したキーのラウンドトリップ
同じ CodingKeys が両方向の処理を担うため、値はsnake_caseでエンコードされ、同じSwiftの値に戻すことができます。
import Foundation
struct User: Codable {
var firstName: String
var lastName: String
enum CodingKeys: String, CodingKey {
case firstName = "first_name"
case lastName = "last_name"
}
}
let u = User(firstName: "Ada", lastName: "Lovelace")
let data = try JSONEncoder().encode(u)
let back = try JSONDecoder().decode(User.self, from: data)
print(back.firstName, back.lastName)CodingKeys を使う場面
個々のキーを正確に制御する必要がある場合、一部のキーだけ名前が異なる場合、またはプロパティを省略する必要がある場合は、明示的な CodingKeys 列挙型を使います。API全体でsnake_caseが使われている場合は、デコード戦略のほうが簡単なことがあります。
import Foundation
struct Event: Codable {
var eventName: String
var startTime: String
enum CodingKeys: String, CodingKey {
case eventName = "name"
case startTime = "start_time"
}
}
let json = "{\"name\":\"Launch\",\"start_time\":\"10:00\"}"
let e = try JSONDecoder().decode(Event.self, from: json.data(using: .utf8)!)
print(e.eventName, e.startTime)クイックチェック: CodingKeys
キーの名前変更についての理解を確認します。
まとめ: 名前変更のための CodingKeys
キーを正確に制御する方法を学びました。
- 型の中に
enum CodingKeys: String, CodingKeyをネストして宣言します。 - 各caseのraw valueがJSONキーになり、caseがエンコードとデコードの両方を制御します。
- コード化したいすべてのプロパティを一覧にします。1つ省略すると、そのプロパティは対象外になります(デフォルト値が必要です)。
- ネストされた型には、それぞれ独立した
CodingKeysがあります。
よくある質問
「名前変更のためのCodingKeys」レッスンは無料ですか?
はい。「名前変更のためのCodingKeys」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。
「名前変更のためのCodingKeys」で何を学びますか?
異なるJSON名とプロパティ名を対応付けます。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
Swift Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「名前変更のためのCodingKeys」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このSwift Academyレッスンでコードを書いて実行できますか?
はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- 名前変更のためのCodingKeys
- キーと日付のデコード戦略
- 手動のencode(to:)とinit(from:)
- 異種JSONのデコード