目次
はじめに
謝辞
増補改訂第3版での更新点
サポートページ
第1章 Swiftはどのような言語か
1.1
言語の特徴
- 静的型付き言語
 - nilの許容性をコントロール可能
 - 型推論による簡潔な記述
 - ジェネリクスによる汎用的な記述
 - Objective-Cと連携可能
 
1.2
開発環境
- ツールチェインのインストール
- macOS
 - Linux
 
 - ライブラリ
- 標準ライブラリ ── 言語の一部となるライブラリ
 - コアライブラリ ── 高機能な汎用ライブラリ
 
 - 開発ツール
- Swift Package Manager ── パッケージ管理ツール
 - LLDB ── デバッグツール
 
 
1.3
プログラムの実行方法
- コマンドラインによる実行方法
- REPLによるインタラクティブな実行
 - 単一ファイルのプログラムの実行
 - 複数のファイルから構成されるプログラムの実行
 
 - Xcodeにおける実行方法
- Playgroundによるインタラクティブな実行
 - 複数のファイルから構成されるプログラムの実行
 
 
1.4
本書のサンプルコードの実行方法
1.5
命名規則
- 名前に使用可能な文字
 - 単語の区切り方
 - 単語の選び方
 
1.6
本書の構成
1.7
まとめ
第2章 変数と定数と式
2.1
変数と定数による値の管理
2.2
変数と定数の基本
- 宣言方法
 - 値の代入方法
- 代入可能な値
 - 代入による型推論
 - 定数への再代入
 
 - 値の利用方法
- 初期化前の変数や定数の利用
 
 - 型の確認方法
 
2.3
スコープ ── 名前の有効範囲
- ローカルスコープ ── 局所的に定義されるスコープ
 - グローバルスコープ ── プログラム全体から参照できるスコープ
 - スコープの優先順位
 
2.4
式の組み立て
- 値の返却のみを行う式
- 変数や定数の値を返却する式
 - リテラル式 ── 値をプログラムに直接表記する式
 - メンバー式 ── 型のメンバーにアクセスする式
 - クロージャ式 ── 呼び出し可能な処理を定義する式
 
 - 演算を行う式
- 算術演算子 ── 算術を行う演算子
 - 符号演算子 ── 数値の符号を指定する演算子
 - 否定演算子 ── 論理値の反転を行う演算子
 
 - 処理を呼び出す式
- 関数を呼び出す式
 - イニシャライザを呼び出す式
 
 
2.5
まとめ
第3章 基本的な型
3.1
型による値の表現
3.2
Bool型 ── 真理値を表す型
- 真理値リテラル
 - 論理演算
- 否定
 - 論理積
 - 論理和
 
 
3.3
数値型 ── 数値を表す型
- 数値リテラル
 - 数値型の種類
- 整数型
 - 浮動小数点型
 
 - 数値型どうしの相互変換
 - 数値型の操作
- 比較
 - 算術
 - Foundationによる高度な操作
 
 
3.4
String型 ── 文字列を表す型
- 文字列リテラル
- 特殊文字の表現
 - 文字列リテラル内での値の展開
 - 複数行の文字列リテラル
 
 - 数値型との相互変換
 - String型の操作
- 比較
 - 結合
 - Foundationによる高度な操作
 
 
3.5
Optional<Wrapped>型 ── 値があるか空のいずれかを表す型
- Optional<Wrapped>型の2つのケース ── 値の不在を表す.noneと、値の存在を表す.some
- 型推論
 
 - Optional<Wrapped>型の値の生成
- nilリテラルの代入による.noneの生成
 - イニシャライザによる.someの生成
 - 値の代入による.someの生成
 
 - Optional<Wrapped>型のアンラップ ── 値の取り出し
- オプショナルバインディング ── if文による値の取り出し
 - ??演算子 ── 値が存在しない場合のデフォルト値を指定する演算子
 - 強制アンラップ ── !演算子によるOptional<Wrapped>型の値の取り出し
 
 - オプショナルチェイン ── アンラップを伴わずに値のプロパティやメソッドにアクセス
 - map(_:)メソッドとflatMap(_:)メソッド ── アンラップを伴わずに値の変換を行うメソッド
 - 暗黙的にアンラップされたOptional<Wrapped>型
 - 値の取り出し方法の使い分け
 
3.6
Any型 ── 任意の型を表す型
- Any型への代入による型の損失
 
3.7
タプル型 ── 複数の型をまとめる型
- 要素へのアクセス
- インデックスによるアクセス
 - 要素名によるアクセス
 - 代入によるアクセス
 
 - Void型 ── 空のタプル
 
3.8
型のキャスト ── 別の型として扱う操作
- アップキャスト ── 上位の型として扱う操作
 - ダウンキャスト ── 下位の型として扱う操作
 - 型の判定
 
3.9
値の比較のためのプロトコル
- Equatableプロトコル ── 同値性を検証するためのプロトコル
- Comparableプロトコル ── 大小関係を検証するためのプロトコル
 
 
3.10
まとめ
第4章 コレクションを表す型
4.1
値の集まりの表現
4.2
Array<Element>型 ── 配列を表す型
- 配列リテラル
- 型推論
 - 要素にできる型
 
 - Array<Element>型の操作
- 要素へのアクセス
 - 要素の更新、追加、結合、削除
 
 
4.3
Dictionary<Key, Value>型 ── 辞書を表す型
- 辞書リテラル
- 型推論
 - キーと値にできる型
 
 - Dictionary<Key, Value>型の操作
- 値へのアクセス
 - 値の更新、追加、削除
 
 
4.4
範囲型 ── 範囲を表す型
- 範囲演算子 ── 範囲を作る演算子
- ..<演算子 ── 末尾の値を含まない範囲を作る演算子
 - ...演算子 ── 末尾の値を含む範囲を作る演算子
 - 型推論
 - 境界に使用可能な型
 
 - 範囲型の操作
- 境界の値へのアクセス
 - 値が範囲に含まれるかどうかの判定
 
 
4.5
コレクションとしてのString型
- Character型 ── 文字を表す型
 - String.Index型 ── 文字列内の位置を表す型
 
4.6
シーケンスとコレクションを扱うためのプロトコル
- Sequenceプロトコル ── 要素への順次アクセス
- forEach(_:)メソッド ── 要素に対して順次アクセスする
 - filter(_:)メソッド ── 要素を絞り込む
 - map(_:)メソッド ── 要素を変換する
 - flatMap(_:)メソッド ── 要素をシーケンスに変換し、それを1つのシーケンスに連結する
 - compactMap(_:)メソッド ── 要素を、失敗する可能性のある処理を用いて変換する
 - reduce(_:_:)メソッド ── 要素を1つの値にまとめる
 
 - Collectionプロトコル ── サブスクリプトによる要素へのアクセス
 
4.7
まとめ
第5章 制御構文
5.1
プログラムの実行フローの制御
5.2
条件分岐
- if文 ── 条件の成否による分岐
- 条件式に使用できる型
 - else節 ── 条件不成立時の処理
 - if-let文 ── 値の有無による分岐
 
 - guard文 ── 条件不成立時に早期退出する分岐
- guard文のスコープ外への退出の強制
 - guard文で宣言された変数や定数へのアクセス
 - if文との使い分け
 
 - switch文 ── 複数のパターンマッチによる分岐
- ケースの網羅性チェック
 - defaultキーワード ── デフォルトケースによる網羅性の保証
 - whereキーワード ── ケースにマッチする条件の追加
 - break文 ── ケースの実行の中断
 - ラベル ── break文の制御対象の指定
 - fallthrough文 ── switch文の次のケースへの制御の移動
 
 
5.3
繰り返し
- 繰り返し文の種類
- for-in文 ── シーケンスの要素の列挙
 - while文 ── 継続条件による繰り返し
 - repeat-while文 ── 初回実行を保証する繰り返し
 
 - 実行文の中断
- break文 ── 繰り返しの終了
 - continue文 ── 繰り返しの継続
 - ラベル ── break文やcontinue文の制御対象の指定
 
 
5.4
遅延実行
- defer文 ── スコープ退出時の処理
 
5.5
パターンマッチ ── 値の構造や性質による評価
- パターンの種類
- 式パターン ── ~=演算子による評価
 - バリューバインディングパターン ── 値の代入を伴う評価
 - オプショナルパターン ── Optional<Wrapped>型の値の有無を評価
 - 列挙型ケースパターン ── ケースとの一致の評価
 - is演算子による型キャスティングパターン ── 型の判定による評価
 - as演算子による型キャスティングパターン ── 型のキャストによる評価
 
 - パターンマッチが使える場所
- if文
 - guard文
 - for-in文
 - while文
 - do文のcatch節
 
 
5.6
まとめ
第6章 関数とクロージャ
6.1
処理の再利用
6.2
関数 ── 名前を持ったひとまとまりの処理
- 定義方法
 - 実行方法
 - 引数
- 仮引数と実引数
 - 外部引数名と内部引数名
 - 外部引数名の省略
 - デフォルト引数 ── 引数のデフォルト値
 - インアウト引数 ── 関数外に変更を共有する引数
 - 可変長引数 ── 任意の個数の値を受け取る引数
 - コンパイラによる引数チェック
 
 - 戻り値
- 戻り値がない関数
 - コンパイラによる戻り値チェック
 - 暗黙的なreturn
 
 
6.3
クロージャ ── スコープ内の変数や定数を保持したひとまとまりの処理
- 定義方法
- 型推論
 
 - 実行方法
 - 引数
- 簡略引数名 ── 引数名の省略
 
 - 戻り値
 - クロージャによる変数と定数のキャプチャ
 - 引数としてのクロージャ
- 属性の指定方法
 - escaping属性 ── 非同期的に実行されるクロージャ
 - autoclosure属性 ── クロージャを用いた遅延評価
 - トレイリングクロージャ ── 引数のクロージャを()の外に記述する記法
 
 - クロージャとしての関数
 - クロージャ式を利用した変数や定数の初期化
 
6.4
まとめ
第7章 型の構成要素 ── プロパティ、イニシャライザ、メソッド
7.1
型に共通するもの
7.2
型の基本
- 定義方法
 - インスタンス化の方法
 - 型の内部でのインスタンスへのアクセス
 - 型の内部での型自身へのアクセス
 
7.3
プロパティ ── 型に紐付いた値
- 定義方法
 - 紐付く対象による分類
- インスタンスプロパティ ── 型のインスタンスに紐付くプロパティ
 - スタティックプロパティ ── 型自身に紐付くプロパティ
 
 - ストアドプロパティ ── 値を保持するプロパティ
- プロパティオブザーバ ── ストアドプロパティの変更の監視
 - レイジーストアドプロパティ ── アクセス時まで初期化を遅延させるプロパティ
 
 - コンピューテッドプロパティ ── 値を保持せずに算出するプロパティ
- ゲッタ ── 値の返却
 - セッタ ── 値の更新
 - セッタの省略
 
 
7.4
イニシャライザ ── インスタンスの初期化処理
- 定義方法
 - 失敗可能イニシャライザ ── 初期化の失敗を考慮したイニシャライザ
 - コンパイラによる初期化チェック
 
7.5
メソッド ── 型に紐付いた関数
- 定義方法
 - 紐付く対象による分類
- インスタンスメソッド ── 型のインスタンスに紐付くメソッド
 - スタティックメソッド ── 型自身に紐付くメソッド
 
 - オーバーロード ── 型が異なる同名のメソッドの定義
- 引数によるオーバーロード
 - 戻り値によるオーバーロード
 
 
7.6
サブスクリプト ── コレクションの要素へのアクセス
- 定義方法
 - セッタの省略
 - オーバーロード ── 型が異なるサブスクリプトの定義
 
7.7
エクステンション ── 型の拡張
- 定義方法
 - メソッドの追加
 - コンピューテッドプロパティの追加
 - イニシャライザの追加
 
7.8
型のネスト
- 定義方法
 
7.9
まとめ
第8章 型の種類 ── 構造体、クラス、列挙型
8.1
型の種類を使い分ける目的
8.2
値の受け渡し方法による分類
- 値型 ── 値を表す型
- 変数と定数への代入とコピー
 - mutatingキーワード ── 自身の値の変更を宣言するキーワード
 
 - 参照型 ── 値への参照を表す型
- 値の変更の共有
 
 - 値型と参照型の使い分け
 
8.3
構造体 ── 値型のデータ構造
- 定義方法
 - ストアドプロパティの変更による値の変更
- 定数のストアドプロパティは変更できない
 - メソッド内のストアドプロパティの変更にはmutatingキーワードが必要
 
 - メンバーワイズイニシャライザ ── デフォルトで用意されるイニシャライザ
- メンバーワイズイニシャライザのデフォルト引数
 
 
8.4
クラス ── 参照型のデータ構造
- 定義方法
 - 継承 ── 型の構成要素の引き継ぎ
- 定義方法
 - オーバーライド ── 型の構成要素の再定義
 - finalキーワード ── 継承とオーバーライドの禁止
 
 - クラスに紐付く要素
- クラスプロパティ ── クラス自身に紐付くプロパティ
 - クラスメソッド ── クラス自身に紐付くメソッド
 - スタティックプロパティ、スタティックメソッドとの使い分け
 
 - イニシャライザの種類と初期化のプロセス
- 指定イニシャライザ ── 主となるイニシャライザ
 - コンビニエンスイニシャライザ ── 指定イニシャライザをラップするイニシャライザ
 - 2段階初期化
 - デフォルトイニシャライザ ── プロパティの初期化が不要な場合に定義されるイニシャライザ
 
 - クラスのメモリ管理
- デイニシャライザ ── インスタンスの終了処理
 
 - 値の比較と参照の比較
 
8.5
列挙型 ── 複数の識別子をまとめる型
- 定義方法
 - ローバリュー ── 実体の定義
- ローバリューのデフォルト値
 
 - 連想値 ── 付加情報の付与
 - CaseIterableプロトコル ── 要素列挙のプロトコル
- コンパイラによるallCasesプロパティのコードの自動生成
 - allCasesプロパティのコードが自動生成されない条件
 
 
8.6
まとめ
第9章 プロトコル ── 型のインタフェースの定義
9.1
型のインタフェースを定義する目的
9.2
プロトコルの基本
- 定義方法
 - 準拠方法
- クラス継承時の準拠方法
 - エクステンションによる準拠方法
 - コンパイラによる準拠チェック
 
 - 利用方法
- プロトコルコンポジション ── 複数のプロトコルの組み合わせ
 
 
9.3
プロトコルを構成する要素
- プロパティ
- 定義方法
 - ゲッタの実装
 - セッタの実装
 
 - メソッド
- 定義方法
 - メソッドの実装
 - mutatingキーワード ── 値型のインスタンスの変更を宣言するキーワード
 
 - 連想型 ── プロトコルの準拠時に指定可能な型
- 定義方法
 - 型制約の追加
 - デフォルトの型の指定
 
 - プロトコルの継承
 - クラス専用プロトコル
 
9.4
プロトコルエクステンション ── プロトコルの実装の定義
- 定義方法
 - デフォルト実装による実装の任意化
 - 型制約の追加
 
9.5
まとめ
第10章 ジェネリクス ── 汎用的な関数と型
10.1
汎用的なプログラム
10.2
ジェネリクスの基本
- 定義方法
 - 特殊化方法
 - 仮型引数と実型引数
 - 汎用性と型安全性の両立
 - Any型との比較
 
10.3
ジェネリック関数 ── 汎用的な関数
- 定義方法
 - 特殊化方法
- 引数からの型推論による特殊化
 - 戻り値からの型推論による特殊化
 
 - 型制約 ── 型引数に対する制約
- スーパークラスや準拠するプロトコルに対する制約
 - 連想型のスーパークラスや準拠するプロトコルに対する制約
 - 型どうしの一致を要求する制約
 
 
10.4
ジェネリック型 ── 汎用的な型
- 定義方法
 - 特殊化方法
- 型引数の指定による特殊化
 - 型推論による特殊化
 
 - 型制約 ── 型引数に対する制約
- 型の定義で使用できる型制約
 - ジェネリック型の型制約付きエクステンション
 - プロトコルへの条件付き準拠
 
 
10.5
まとめ
第11章 モジュール ── 配布可能なプログラムの単位
11.1
再利用可能かつ配布可能なプログラム
11.2
モジュールの作成と利用
- ビルドターゲットの定義
 - ビルドターゲットの依存関係の定義
 - 外部パッケージの利用
 
11.3
名前空間 ── 名前が一意となる範囲
- import文 ── モジュールのインポートを行う文
 - 名前の衝突の回避
 
11.4
アクセスコントロール ── 外部からの使用の制限
- アクセスレベル ── 公開範囲の分類
- 指定方法
 - デフォルトのアクセスレベル
 - エクステンションのアクセスレベル
 
 - モジュールヘッダ ── モジュール外から参照可能なインタフェース
- 閲覧方法
 - モジュールヘッダに記述される情報
 - ドキュメントコメント ── コードの意図や使用方法の説明
 
 
11.5
まとめ
第12章 型の設計指針
12.1
クラスに対する構造体の優位性
- 参照型のクラスがもたらすバグ
 - 値型の構造体がもたらす安全性
 - コピーオンライト ── 構造体の不要なコピーを発生させない最適化
 - クラスを利用するべきとき
- 参照を共有する
 - インスタンスのライフサイクルに合わせて処理を実行する
 
 
12.2
クラスの継承に対するプロトコルの優位性
- クラスの継承がもたらす期待しない挙動
 - プロトコルによるクラスの継承の問題点の克服
 - クラスの継承を利用するべきとき
- 複数の型の間でストアドプロパティの実装を共有する
 
 
12.3
オプショナル型の利用指針
- Optional<Wrapped>型を利用するべきとき
- 値の不在が想定される
 - ただし、必然性のないOptional<Wrapped>型のプロパティは排除する
 
 - 暗黙的にアンラップされたOptional<Wrapped>型を利用するべきとき
- 初期化時にのみ値が決まっていない
 - サブクラスの初期化より前にスーパークラスを初期化する
 
 - Optional<Wrapped>型と暗黙的にアンラップされたOptional<Wrapped>型を比較検討するべきとき
 
12.4
まとめ
第13章 イベント通知
13.1
Swiftにおけるイベント通知のパターン
13.2
デリゲートパターン ── 別オブジェクトへの処理の委譲
- 実装方法
- 命名規則
 - 弱参照による循環参照への対処
 
 - 利用するべきとき
- 2つのオブジェクト間で多くの種類のイベント通知を行う
 - 外部からのカスタマイズを前提としたオブジェクトを設計する
 
 
13.3
クロージャ ── 別オブジェクトへのコールバック時の処理の登録
- 実装方法
- キャプチャリスト ── キャプチャ時の参照方法の制御
 - weakキーワード ── メモリ解放を想定した弱参照
 - unownedキーワード ── メモリ解放を想定しない弱参照
 - キャプチャリストの使い分け
 - escaping属性によるselfキーワードの必須化
 - typealiasキーワードによる複雑なクロージャの型への型エイリアス
 
 - 利用するべきとき
- 処理の実行とコールバックを同じ箇所に記述する
 
 
13.4
オブザーバパターン ── 状態変化の別オブジェクトへの通知
- 実装方法
- Selector型 ── メソッドを参照するための型
 
 - 利用するべきとき
 - 1対多のイベント通知を行う
 
13.5
まとめ
第14章 非同期処理
14.1
Swiftにおける非同期処理
14.2
GCD ── 非同期処理のための低レベルAPI群
- 実装方法
- ディスパッチキューの種類
 - 既存のディスパッチキューの取得
 - 新規のディスパッチキューの生成
 - ディスパッチキューへのタスクの追加
 
 - 利用するべきとき
- シンプルな非同期処理を実装する
 
 
14.3
Operation、OperationQueueクラス ── 非同期処理を抽象化したクラス
- 実装方法
- タスクの定義
 - キューの生成
 - キューへのタスクの追加
 - タスクのキャンセル
 - タスクの依存関係の設定
 
 - 利用するべきとき
- 複雑な非同期処理を実装する
 
 
14.4
Threadクラス ── 手動でのスレッド管理
- 実装方法
 - 利用するべきとき
- 特になし
 
 
14.5
非同期処理の結果のイベント通知
14.6
まとめ
第15章 エラー処理
15.1
Swiftにおけるエラー処理
15.2
Optional<Wrapped>型によるエラー処理 ── 値の有無による成功、失敗の表現
- 実装方法
 - 利用するべきとき
- 値の有無だけで結果を十分に表せる
 
 
15.3
Result<Success, Failure>型によるエラー処理 ── 列挙型による成功、失敗の表現
- 実装方法
 - 利用するべきとき
- エラーの詳細を提供する
 - 成功か失敗のいずれかであることを保証する
 - 非同期処理のエラーを扱う
 
 
15.4
do-catch文によるエラー処理 ── Swift標準のエラー処理
- 実装方法
- Errorプロトコル ── エラー情報を表現するプロトコル
 - throwsキーワード ── エラーを発生させる可能性のある処理の定義
 - rethrowsキーワード ── 引数のクロージャが発生させるエラーの呼び出し元への伝播
 - tryキーワード ── エラーを発生させる可能性のある処理の実行
 - try!キーワード ── エラーを無視した処理の実行
 - try?キーワード ── エラーをOptional<Wrapped>型で表す処理の実行
 - defer文によるエラーの有無に関わらない処理の実行
 
 - 利用するべきとき
- エラーの詳細を提供する
 - 成功か失敗のいずれかであることを保証する
 - 連続した処理のエラーをまとめて扱う
 - エラー処理を強制する
 
 
15.5
fatalError(_:)関数によるプログラムの終了 ── 実行が想定されていない箇所の宣言
- 実装方法
- Never型 ── 値を返さないことを示す型
 
 - 利用するべきとき
- 想定外の状況ではプログラムを終了させる
 
 
15.6
アサーションによるデバッグ時のプログラムの終了 ── 満たすべき条件の宣言
- 実装方法
- assert(_:_:)関数 ── 条件を満たさない場合に終了するアサーション
 - assertionFailure(_:)関数 ── 必ず終了するアサーション
 - コンパイルの最適化レベル ── デバッグとリリースの切り替え
 
 - 利用するべきとき
- デバッグ時に想定外の状況を検出する
 - リリース時は想定外の状況でもプログラムの実行を継続する
 
 
15.7
エラー処理の使い分け
15.8
まとめ
第16章 Webサービスとの連携
16.1
連携のための取り決め
16.2
データの取り扱い
- Data型 ── バイト列を表す型
 - エンコードとデコード
- JSONEncoderクラス、JSONDecoderクラス ── JSONをエンコード、デコードする
 - Encodable、Decodable、Codableプロトコル ── 型をエンコード、デコードに対応させる
 - コンパイラによるコードの自動生成
 
 
16.3
HTTPによるWebサービスとの通信
- URLRequest型 ── リクエスト情報の表現
 - HTTPURLResponse型 ── HTTPレスポンスのメタデータ
 - URLSessionクラス ── URL経由でのデータの送信、取得
- 3種類のタスク ── 基本、アップロード用、ダウンロード用
 - タスクの実行
 
 
16.4
まとめ
第17章 ユニットテスト
17.1
ユニットテストの目的
17.2
ユニットテストのセットアップ
- テストターゲットの構成
 - テストの実行
 - Linux用のテストの列挙
 
17.3
テストコードの基本
- 定義方法
 - テスト対象のモジュールのインポート
 - アサーション ── 値の検証
- 単一の式を評価するアサーション
 - 2つの式を比較するアサーション
 - エラーの有無を評価するアサーション
 - 無条件に失敗するアサーション
 
 
17.4
テストケース ── テストをまとめる
- テストの事前処理と事後処理
- setUp()メソッド ── テストの事前処理を行うメソッド
 - tearDown()メソッド ── テストの事後処理を行うメソッド
 
 - テストの実行のコントロール
- 失敗時のテストの中断
 - エラーによるテストの中断
 - 非同期処理の待ち合わせ
 
 
17.5
スタブ ── テスト対象への入力を置き換える
- プロトコルによる実装の差し替え
- 依存先のプロトコル化
 - プロトコルに準拠したスタブの実装
 - テストにおけるスタブの使用
 
 
17.6
まとめ
第18章 実践的なSwiftアプリケーション ── Web APIクライアントを作ろう
18.1
GitHub Search APIクライアントを作ろう
18.2
実装の下準備
- API仕様と動作の確認
 - コマンドラインアプリケーションのパッケージの作成
 - 実装方針の確認
 
18.3
API仕様のモデル化
- レスポンス ── サーバ上のリソースの表現
- 構造体の定義
 - JSONから構造体へのマッピング
 - JSONから構造体へのマッピングに対するテスト
 - ジェネリック型による検索結果の表現
 - JSONからジェネリック型へのマッピングに対するテスト
 
 - エラー ── APIクライアントで発生するエラーの表現
- エラーの分類
 - エラーを表すレスポンスのモデル化
 - JSONからエラーの型へのマッピングに対するテスト
 
 - リクエスト ── サーバに対する要求の表現
- ベースURLとパスの定義
 - HTTPメソッドの定義
 - パラメータの定義
 - リクエストとレスポンスの紐付け
 - リポジトリ検索APIの実装
 
 
18.4
APIクライアント ── Web API呼び出しの抽象化
- API仕様をモデル化した型とFoundationの型の変換
- リクエストを表す型のURLRequest型へのマッピング
 - Data型とHTTPURLResponse型のレスポンスを表す型へのマッピング
 
 - APIクライアントの構成要素間の接続
- HTTPクライアントの実装
 - APIクライアントのインタフェースの定義
 - HTTPリクエストの送信
 - HTTPレスポンスの処理
 - 通信結果の処理に対するテスト
 
 
18.5
プログラムの実行
- エントリポイントの準備
 - 実行ファイルのビルドと実行