書籍概要

WEB+DB PRESS plus

[増補改訂第3版]Swift実践入門
──直感的な文法と安全性を兼ね備えた言語

著者
発売日
更新日

概要

本書は,Swiftの言語仕様と実践的な利用方法を解説した入門書です。増補改訂第3版では,新バージョンのSwift 5に対応し,実践入門という趣旨に合わせて,第16章「Webサービスとの連携」と第17章「ユニットテスト」を新設しました。

Swiftは簡潔な言語ですが,その言語仕様を理解し,正しく使うことはけっして容易ではありません。Appleの公式ドキュメントをはじめとして,どんな言語仕様があり,それらをどのように使うかに関しては豊富な情報源があります。しかし,それらがなぜ存在し,いつ使うべきかについてまとまった情報があるとは言えません。本書は,読者のみなさんの「なぜ」や「いつ」を解消することにも主眼を置いています。

本書では,はじめにSwiftの標準的な機能を一通り解説し,続いて型の設計指針や非同期処理,エラー処理などの実装パターンを説明します。最後に,実践的なSwiftアプリケーションの開発を通じて,それまでに説明した機能と実装パターンの具体的な活用方法を示します。

こんな方におすすめ

  • これからSwiftを学びたい方
  • Swiftのより実践的な知識を身に付けたい方

目次

はじめに

謝辞

増補改訂第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
プログラムの実行

  • エントリポイントの準備
  • 実行ファイルのビルドと実行

18.6
まとめ

あとがき

索引

著者プロフィール

サポート

ダウンロード

(2021年2月15日更新)

以下のファイルをダウンロードできます。圧縮ファイルをダウンロードしていただき,適宜解凍してご利用ください。

ダウンロード
サンプルコードファイル

正誤表

本書の以下の部分に誤りがありました。ここに訂正するとともに,ご迷惑をおかけしたことを深くお詫び申し上げます。

(2022年9月20日最終更新)

P.387 コードの下から4行目

let int = try throwableIntFunction(throwsError: false)
let int = try throwableIntFunction(throwsError: true)

P.411 1つ目のコードの下から2行目

public var errors: [error]
public var errors: [Error]

(以下2022年6月6日更新)

以下,第1刷まで。

P.53 2段落目

上記のコードの「2つの文字列間の順序の比較」部分では、compare(_:option:)メソッドで2つの文字列間の順序を検証しています。引数optionに.caseInsensitiveを与えているので、大文字と小文字は区別されません。
上記のコードの「2つの文字列間の順序の比較」部分では、compare(_:options:)メソッドで2つの文字列間の順序を検証しています。引数optionsに.caseInsensitiveを与えているので、大文字と小文字は区別されません。

P.134 1つ目のコードの2行目

return "\(int)"
return "\(from)"

商品一覧