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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Codableへの適合
- JSONEncoderによるエンコード
- JSONDecoderによるデコード
- Optional型とネストした型の処理