0Pricing
Swift Academy · レッスン

Optional型とネストした型の処理

optionalやネストした構造を安全にデコードします。

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

オプショナルのプロパティ

ラップされている型が Codable なら、オプショナルのプロパティも自然に Codable になります。JSONキーがない場合は nil にデコードされ、キーがある場合は通常どおりデコードされます。

import Foundation

struct User: Codable {
    var name: String
    var nickname: String?
}

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

nil のオプショナルのエンコード

デフォルトでは、nil のオプショナルはエンコードされたJSONから完全に省略され、ペイロードが小さくなります。

import Foundation

struct User: Codable {
    var name: String
    var nickname: String?
}

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

明示的な null の nil へのデコード

オプショナルのプロパティに明示的な null がJSONに含まれている場合、エラーをスローせずに nil へデコードされます。

import Foundation

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

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

ネストされた Codable 構造体

Codable 型をネストしてモデルを構成できます。外側の型が内側の型を自動的にエンコードおよびデコードします。

import Foundation

struct Address: Codable { var city: String; var zip: String }
struct Person: Codable { var name: String; var address: Address }

let p = Person(name: "Lee", address: Address(city: "Rome", zip: "00100"))
let data = try JSONEncoder().encode(p)
print(String(data: data, encoding: .utf8)!)

ネストされた構造体のデコード

逆方向の処理も同様です。ネストされたJSONオブジェクトは、ネストされた構造体のプロパティにデコードされます。

import Foundation

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

let json = "{\"name\":\"Lee\",\"address\":{\"city\":\"Rome\"}}"
let p = try JSONDecoder().decode(Person.self, from: json.data(using: .utf8)!)
print(p.address.city)

オプショナルなネスト型

ネストされた構造体自体をオプショナルにすることもできます。キーが存在しない場合、ネストされた値全体が nil になります。

import Foundation

struct Address: Codable { var city: String }
struct Person: Codable { var name: String; var address: Address? }

let json = "{\"name\":\"Lee\"}"
let p = try JSONDecoder().decode(Person.self, from: json.data(using: .utf8)!)
print(p.address?.city ?? "no address")

Codable の配列

Codable な要素型の配列自体も Codable です。オブジェクトのJSON配列に直接対応します。

import Foundation

struct Tag: Codable { var name: String }
struct Post: Codable { var title: String; var tags: [Tag] }

let p = Post(title: "Hi", tags: [Tag(name: "swift"), Tag(name: "json")])
let data = try JSONEncoder().encode(p)
print(String(data: data, encoding: .utf8)!)

構造体の配列のデコード

オブジェクトのJSON配列をデコードすると、反復処理できる型付きの値を含むSwift配列が得られます。

import Foundation

struct Tag: Codable { var name: String }

let json = "[{\"name\":\"a\"},{\"name\":\"b\"}]"
let tags = try JSONDecoder().decode([Tag].self, from: json.data(using: .utf8)!)
for t in tags { print(t.name) }

オプショナルな配列

オプショナルな配列では、「キーが存在しない」(nil)状態と「キーは存在するが空である」([])状態を区別できます。どちらも有効で意味のある状態です。

import Foundation

struct Box: Codable { var items: [String]? }

let a = try JSONDecoder().decode(Box.self, from: "{}".data(using: .utf8)!)
let b = try JSONDecoder().decode(Box.self, from: "{\"items\":[]}".data(using: .utf8)!)
print(a.items == nil, b.items == [])

深くネストされた構造

構造体の中に配列があり、その配列の中に構造体があるというように、ネストは何階層にもできます。Codable は各層を再帰的に処理します。

import Foundation

struct Comment: Codable { var text: String }
struct Article: Codable { var title: String; var comments: [Comment] }
struct Feed: Codable { var articles: [Article] }

let feed = Feed(articles: [Article(title: "A", comments: [Comment(text: "hi")])])
let data = try JSONEncoder().encode(feed)
print(String(data: data, encoding: .utf8)!)

オプショナルとネストのラウンドトリップ

オプショナルなフィールド、ネストされた構造体、配列を組み合わせても、完全なエンコードとデコードのラウンドトリップで内容がそのまま保たれます。

import Foundation

struct Address: Codable { var city: String }
struct Person: Codable {
    var name: String
    var address: Address?
    var hobbies: [String]
}

let p = Person(name: "Mo", address: Address(city: "Cairo"), hobbies: ["chess"])
let data = try JSONEncoder().encode(p)
let back = try JSONDecoder().decode(Person.self, from: data)
print(back.address?.city ?? "-", back.hobbies.first ?? "-")

クイックチェック: オプショナルとネスト

オプショナルな Codable 型とネストされた Codable 型についての理解を確認します。

まとめ: オプショナル型とネスト型

Codable がより複雑なデータ構造をどのように扱うかを学びました。

  • オプショナルなプロパティは、キーの欠落や明示的な null を許容し、nil にデコードされます。
  • nil のオプショナルは、デフォルトではエンコード時に省略されます。
  • ネストされた Codable 構造体と配列は、再帰的にエンコードおよびデコードされます。
  • オプショナルな配列では、存在しない状態(nil)と空の状態([])を区別できます。

よくある質問

「Optional型とネストした型の処理」レッスンは無料ですか?

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

「Optional型とネストした型の処理」で何を学びますか?

optionalやネストした構造を安全にデコードします。 ブラウザで直接実行するハンズオンコードでSwift Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

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

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

「Optional型とネストした型の処理」レッスンにはどのくらい時間がかかりますか?

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

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

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

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

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