0Pricing
Swift Academy · レッスン

名前変更のための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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 名前変更のためのCodingKeys
  2. キーと日付のデコード戦略
  3. 手動のencode(to:)とinit(from:)
  4. 異種JSONのデコード
← Swift Academyに戻る