0Pricing
Swift Academy · レッスン

Codableへの適合

型を自動的にエンコード可能・デコード可能にします。

「Codableへの適合」はCoddyKit上の無料Swift Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはSwift Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Swift Academyコースには全4レッスンが含まれています。

Codableとは

CodableはEncodable & Decodableの型エイリアスです。型をこれに適合させると、SwiftはインスタンスをJSONなどの外部データに変換し、再びインスタンスとして復元できます。手動でパースするコードは必要ありません。

import Foundation

struct Book: Codable {
    var title: String
    var pages: Int
}

print("Book conforms to Codable")

自動合成

保存されているすべてのプロパティ自体が Codable であれば、コンパイラーがエンコードとデコードの処理を自動的に合成します。プロパティの一覧を書くことだけが必要で、残りは Swift が処理します。

import Foundation

struct User: Codable {
    var name: String
    var age: Int
    var isActive: Bool
}

let u = User(name: "Ada", age: 36, isActive: true)
print(u)

JSONデータへのエンコード

Codable な値は JSONEncoder に渡すことができ、Data のデータを生成します。その Data を String に変換すると、JSONテキストを確認できます。

import Foundation

struct User: Codable {
    var name: String
    var age: Int
}

let u = User(name: "Ada", age: 36)
let data = try JSONEncoder().encode(u)
print(String(data: data, encoding: .utf8)!)

JSONデータからのデコード

逆の処理には JSONDecoder を使います。対象の型と生の Data を渡すと、完全に型付けされた Swift の値を再構築します。

import Foundation

struct User: Codable {
    var name: String
    var age: Int
}

let json = "{\"name\":\"Ada\",\"age\":36}"
let data = json.data(using: .utf8)!
let u = try JSONDecoder().decode(User.self, from: data)
print(u.name, u.age)

値のラウンドトリップ

エンコードしてからデコードすると、元の値と等しい値が返されるはずです。このラウンドトリップは、型の Codable 適合が期待どおりに機能することをすばやく確認する方法です。

import Foundation

struct Point: Codable {
    var x: Int
    var y: Int
}

let p = Point(x: 3, y: 7)
let data = try JSONEncoder().encode(p)
let back = try JSONDecoder().decode(Point.self, from: data)
print(back.x, back.y)

Encodable のみ

片方だけに適合させることもできます。Encodable は、型を出力できますが読み戻すことはできないという意味です。解析する必要のないレスポンスモデルに便利です。

import Foundation

struct Receipt: Encodable {
    var item: String
    var total: Double
}

let r = Receipt(item: "Coffee", total: 4.5)
let data = try JSONEncoder().encode(r)
print(String(data: data, encoding: .utf8)!)

Decodable のみ

同様に、Decodable を使うと、エンコードせずに外部データから型を構築できます。読み取り専用のAPIペイロードを受け取るだけの場合に便利です。

import Foundation

struct Config: Decodable {
    var version: Int
    var debug: Bool
}

let json = "{\"version\":2,\"debug\":true}"
let data = json.data(using: .utf8)!
let c = try JSONDecoder().decode(Config.self, from: data)
print(c.version, c.debug)

サポートされるプロパティの型

String、Int、Double、Bool、Date、Data、URL などの標準ライブラリの型に加え、Codable な要素の配列や辞書は、すべて標準で Codable です。

import Foundation

struct Profile: Codable {
    var name: String
    var tags: [String]
    var scores: [String: Int]
}

let p = Profile(name: "Sam", tags: ["a", "b"], scores: ["math": 90])
let data = try JSONEncoder().encode(p)
print(String(data: data, encoding: .utf8)!)

列挙型も適合できます

String や Int などのraw valueを持つ列挙型は、自動的に Codable になります。JSONではraw valueとしてエンコードされます。

import Foundation

enum Status: String, Codable {
    case active, paused, done
}

struct Task: Codable {
    var title: String
    var status: Status
}

let t = Task(title: "Ship", status: .active)
let data = try JSONEncoder().encode(t)
print(String(data: data, encoding: .utf8)!)

プロパティは Codable である必要があります

合成が機能するのは、保存されている すべての プロパティが Codable の場合だけです。カスタム型をプロパティに使う場合は、その型も適合させる必要があります。そうしないと、コンパイラーは合成を拒否します。

import Foundation

struct Address: Codable {
    var city: String
}

struct Person: Codable {
    var name: String
    var address: Address
}

let p = Person(name: "Lee", address: Address(city: "Rome"))
print(try JSONEncoder().encode(p).count, "bytes")

Codable が重要な理由

Codable を使うと、手作業で書くシリアライズの定型コードが不要になり、型を唯一の信頼できる情報源として保ち、コンパイル時に不一致を検出できます。Swiftアプリと外部データの間でデータをやり取りする標準的な方法です。

import Foundation

struct Settings: Codable {
    var theme: String
    var fontSize: Int
}

let s = Settings(theme: "dark", fontSize: 14)
let data = try JSONEncoder().encode(s)
let back = try JSONDecoder().decode(Settings.self, from: data)
print(back.theme, back.fontSize)

クイックチェック: Codable への適合

適合について学んだ内容を確認します。

まとめ: Codable への適合

Swiftにおけるシリアライズの基礎を学びました。

  • Codable = Encodable & Decodable です。
  • すべてのプロパティが Codable であれば、適合が合成されます。
  • JSONEncoder は Data を生成し、JSONDecoder は値を再構築します。
  • 標準型、raw valueを持つ列挙型、ネストされた Codable 型がすべてサポートされます。

よくある質問

「Codableへの適合」レッスンは無料ですか?

はい。「Codableへの適合」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Swift Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Swift Academyコースには全4レッスンが含まれています。

「Codableへの適合」で何を学びますか?

型を自動的にエンコード可能・デコード可能にします。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Swift Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのSwift Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。

「Codableへの適合」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このSwift Academyレッスンでコードを書いて実行できますか?

はい。すべてのSwift Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

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

  1. Codableへの適合
  2. JSONEncoderによるエンコード
  3. JSONDecoderによるデコード
  4. Optional型とネストした型の処理
← Swift Academyに戻る