Swift実践入門
Swiftの文法書を購入しました。学びの多い1冊になりそうです!
Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)
- 作者: 石川洋資,西山勇世
- 出版社/メーカー: 技術評論社
- 発売日: 2017/02/07
- メディア: 単行本(ソフトカバー)
- この商品を含むブログを見る
目次
はじめに
謝辞
サポートページ
第1章 Swiftはどのような言語か
1.1 言語の特徴
静的型付き言語
nilの許容性をコントロール可能
型推論による簡潔な記述
ジェネリクスによる汎用的な記述
Objective-Cと連携可能
1.2 macOSでの開発環境
Xcodeのインストール
コマンドラインでの実行方法
REPLによるインタラクティブな実行
swiftコマンドによるスクリプトの実行
swiftcコマンドによる実行ファイルの作成
Playgroundでの実行方法
Playgroundファイルの作成
エラーや警告の表示
アニメーションのプレビューなどのリッチな機能
iOS,macOSアプリケーションとしての実行方法
Xcodeプロジェクトの作成
1.3 Swiftのオープンソースプロジェクト
ライブラリ群
標準ライブラリ──言語仕様の一部となるライブラリ
コアライブラリ──高機能な汎用ライブラリ
開発ツール
Swift Package Manager──ライブラリ管理ツール
LLDB──デバッグツール
1.4 命名規則
単語の区切り方
単語の選び方
1.5 本書のサンプルコードの実行方法
1.6 本書の構成
1.7 まとめ
第2章 変数,定数と基本的な型
2.1 変数,定数,型による値の管理
2.2 変数と定数
宣言方法
型推論
型の確認方法
名前に使用可能な文字
宣言時に型を決定する必要がある
代入方法
代入可能な値
使用時までに値を代入しなければならない
定数には再代入を行えない
2.3 スコープ──名前の有効範囲
ローカルスコープ──局所的に定義されるスコープ
グローバルスコープ──プログラム全体から参照できるスコープ
2.4 Bool型──真理値を表す型
真理値リテラル
論理演算
否定
論理積
論理和
2.5 数値型──数値を表す型
数値リテラル
数値型の種類
整数型
浮動小数点型
数値型どうしの相互変換
数値型の操作
比較
算術
Foundationによる高度な操作
2.6 String型──文字列を表す型
文字列リテラル
特殊文字の表現
文字列リテラル内での値の展開
String型の個々の文字を表す型
Character型──文字を表す型
String.CharacterView型──Character型のコレクションを表す型
数値型との相互変換
String型とCharacter型の操作
比較
結合
Foundationによる高度な操作
2.7 Array<Element>型──配列を表す型
配列リテラル
型推論
要素にできる型
Array<Element>型の操作
要素へのアクセス
要素の更新,追加,結合,削除
2.8 Dictionary<Key, Value>型──辞書を表す型
辞書リテラル
型推論
キーと値にできる型
Dictionary<Key, Value>型の操作
値へのアクセス
値の更新,追加,削除
2.9 範囲型──範囲を表す型
範囲演算子──範囲を作る演算子
..<演算子──半開区間を作る演算子
...演算子──閉区間を作る演算子
型推論
両端に使用可能な型
範囲型の操作
両端の値へのアクセス
値が範囲に含まれるかどうかの判定
2.10 Optional<Wrapped>型──値があるか空のいずれかを表す型
Optional<Wrapped>型の2つのケース──値の不在を表す.noneと,値の存在を表す.some
型推論
Optional<Wrapped>型の値の生成
nilリテラルの代入による.noneの生成
イニシャライザによる.someの生成
値の代入による.someの生成
Optional<Wrapped>型のアンラップ──値の取り出し
オプショナルバインディング──if文による値の取り出し
??演算子──値が存在しない場合のデフォルト値を指定する演算子
強制アンラップ──!演算子によるOptional<Wrapped>型の値の取り出し
オプショナルチェイン──アンラップを伴わずに値のプロパティやメソッドにアクセス
ImplicitlyUnwrappedOptional<Wrapped>型──暗黙的に強制アンラップを行うオプショナル型
値の有無を表す2つのケース
値の生成
値の取り出し
値の取り出し方法の使い分け
2.11 Any型──任意の型を表す型
Any型への代入による型の損失
2.12 タプル型──複数の型をまとめる型
要素へのアクセス
インデックスによるアクセス
要素名によるアクセス
代入によるアクセス
Void型──空のタプル
2.13 型のキャスト──別の型として扱う操作
型の判定
アップキャスト──上位の型として扱う操作
ダウンキャスト──下位の型として扱う操作
2.14 まとめ
第3章 制御構文
3.1 プログラムの実行フローの制御
3.2 条件分岐
if文──条件の成否による分岐
条件式に使用できる型
else節──条件不成立時の処理
if-let文──値の有無による分岐
if-case文──パターンマッチによる分岐
guard文──条件不成立時に早期退出する分岐
guard文のスコープ外への退出の強制
guard文で宣言された変数や定数がguard文の外で使用可能
if文との使い分け
switch文──複数のパターンマッチによる分岐
ケースの網羅性チェック
defaultキーワード──デフォルトケースによる網羅性の保証
whereキーワード──ケースにマッチする条件の追加
3.3 繰り返し
for文──要素の列挙
for-in文──すべての要素の列挙
for-case文──パターンマッチによって絞り込まれた要素の列挙
while文──継続条件による繰り返し
repeat-while文──初回実行を保証する繰り返し
3.4 プログラムの制御を移す文
fallthrough文──switch文の次のケースへの制御の移動
break文──switch文のケースの実行や繰り返しの中断
switch文のケースの実行の中断
繰り返しの中断
continue文──繰り返しの継続
ラベル──break文やcontinue文の制御の移動先の指定
3.5 遅延実行
defer文──スコープ退出時の処理
3.6 パターンマッチ──値の構造や性質による評価
式パターン──~=演算子による評価
バリューバインディングパターン──値の代入を伴う評価
列挙型ケースパターン──ケースとの一致の評価
連想値のパターンマッチ
型キャスティングパターン──型キャストによる評価
is演算子による型キャスティングパターン
as演算子による型キャスティングパターン
3.7 まとめ
第4章 関数とクロージャ
4.1 処理の再利用
4.2 関数──名前を持ったひとまとまりの処理
定義方法
実行方法
引数
仮引数と実引数
外部引数名と内部引数名
外部引数名の省略
デフォルト引数──引数のデフォルト値
インアウト引数──関数外に変更を共有する引数
可変長引数──任意の個数の値を受け取る引数
コンパイラによる引数チェック
戻り値
戻り値がない関数
コンパイラによる戻り値チェック
4.3 クロージャ──スコープ内の変数や定数を保持したひとまとまりの処理
定義方法
型推論
実行方法
引数
簡略引数名──引数名の省略
戻り値
クロージャによる変数と定数のキャプチャ
引数としてのクロージャ
属性の指定方法
escaping属性──非同期的に実行されるクロージャ
autoclosure属性──クロージャを用いた遅延評価
トレイリングクロージャ──引数のクロージャを()の外に記述する記法
クロージャとしての関数
クロージャ式を利用した変数や定数の初期化
4.4 まとめ
第5章 型の構成要素──プロパティ,イニシャライザ,メソッド
5.1 型に共通するもの
5.2 型の基本
定義方法
インスタンス自身へのアクセス
インスタンス化の方法
5.3 プロパティ──型に紐付いた値
定義方法
紐付く対象による分類
インスタンスプロパティ──型のインスタンスに紐付くプロパティ
スタティックプロパティ──型自身に紐付くプロパティ
ストアドプロパティ──値を保持するプロパティ
プロパティオブザーバ──ストアドプロパティの変更の監視
コンピューテッドプロパティ──値を保持せずに算出するプロパティ
ゲッタ──値の返却
セッタ──値の更新
セッタの省略
5.4 イニシャライザ──インスタンスの初期化処理
定義方法
失敗可能イニシャライザ──初期化の失敗を考慮したイニシャライザ
コンパイラによる初期化チェック
5.5 メソッド──型に紐付いた関数
定義方法
紐付く対象による分類
インスタンスメソッド──型のインスタンスに紐付くメソッド
スタティックメソッド──型自身に紐付くメソッド
オーバーロード──型が異なる同名のメソッドの定義
引数によるオーバーロード
戻り値によるオーバーロード
5.6 サブスクリプト──コレクションの要素へのアクセス
定義方法
セッタの省略
オーバーロード──型が異なるサブスクリプトの定義
5.7 エクステンション──型の拡張
定義方法
メソッドの追加
コンピューテッドプロパティの追加
イニシャライザの追加
5.8 型のネスト
定義方法
5.9 まとめ
第6章 型の種類──構造体,クラス,列挙型
6.1 型の種類を使い分ける目的
6.2 値の受け渡し方法による分類
値型──値を表す型
変数と定数への代入とコピー
mutatingキーワード──自身の値の変更を宣言するキーワード
参照型──値への参照を表す型
値の変更の共有
値型と参照型の使い分け
6.3 構造体──値型のデータ構造
定義方法
ストアドプロパティの変更による値の変更
定数のストアドプロパティは変更できない
メソッド内のストアドプロパティの変更にはmutatingキーワードが必要
メンバーワイズイニシャライザ──デフォルトで用意されるイニシャライザ
6.4 クラス──参照型のデータ構造
定義方法
継承──型の構成要素の引き継ぎ
定義方法
オーバーライド──型の構成要素の再定義
finalキーワード──継承とオーバーライドの禁止
クラスに紐付く要素
クラスプロパティ──クラス自身に紐付くプロパティ
クラスメソッド──クラス自身に紐付くメソッド
スタティックプロパティ,スタティックメソッドとの使い分け
イニシャライザの種類と初期化のプロセス
指定イニシャライザ──主となるイニシャライザ
コンビニエンスイニシャライザ──指定イニシャライザをラップするイニシャライザ
2段階初期化
デフォルトイニシャライザ──プロパティの初期化が不要な場合に定義されるイニシャライザ
クラスのメモリ管理
デイニシャライザ──インスタンスの終了処理
値の比較と参照の比較
6.5 列挙型──複数の識別子をまとめる型
定義方法
ローバリュー──実体の定義
ローバリューのデフォルト値
連想値──付加情報の付与
6.6 まとめ
第7章 プロトコル──型のインタフェースの定義
7.1 型のインタフェースを定義する目的
7.2 プロトコルの基本
定義方法
準拠方法
クラス継承時の準拠方法
エクステンションによる準拠方法
コンパイラによる準拠チェック
利用方法
7.3 プロトコルを構成する要素
プロパティ
定義方法
ゲッタの実装
セッタの実装
メソッド
定義方法
メソッドの実装
mutatingキーワード──値型のインスタンスの変更を宣言するキーワード
連想型──プロトコルの準拠時に指定可能な型
定義方法
型制約の追加
デフォルトの型の指定
プロトコルの継承
クラス専用プロトコル
7.4 プロトコルエクステンション──プロトコルの実装の定義
定義方法
デフォルト実装による実装の任意化
型制約の追加
プロトコルに準拠する型に対する制約
プロトコルに準拠する型の連想型に対する制約
7.5 標準ライブラリのプロトコル
比較のためのプロトコル
Equatableプロトコル──同値性を確認するためのプロトコル
Comparableプロトコル──大小関係を比較するためのプロトコル
コレクションの操作のためのプロトコル
IteratorProtocolプロトコル──繰り返しのためのプロトコル
Sequenceプロトコル──要素の列挙のためのプロトコル
Collectionプロトコル──サブスクリプトによる要素へのアクセスのためのプロトコル
リテラルから型をインスタンス化するためのプロトコル
7.6 まとめ
第8章 ジェネリクス──汎用的な関数と型
8.1 汎用的なプログラム
8.2 ジェネリクスの基本
定義方法
特殊化方法
仮型引数と実型引数
汎用性と型安全性の両立
Any型との比較
8.3 ジェネリック関数──汎用的な関数
定義方法
特殊化方法
引数からの型推論による特殊化
戻り値からの型推論による特殊化
8.4 ジェネリック型──汎用的な型
定義方法
特殊化方法
型引数の指定による特殊化
型推論による特殊化
8.5 型制約──型引数に対する制約
定義方法
スーパークラスや準拠するプロトコルに対する制約
連想型のスーパークラスや準拠するプロトコルに対する制約
型どうしの一致を要求する制約
8.6 まとめ
第9章 モジュール──配布可能なプログラムの単位
9.1 再利用可能かつ配布可能なプログラム
9.2 モジュールの作成方法
フレームワーク──モジュールやリソースを含むパッケージ
アプリケーション──モジュールやリソースを含む実行可能なパッケージ
9.3 名前空間──名前が一意となる範囲
import文──モジュールのインポートを行う文
名前の衝突の回避
不要になった3文字接頭辞
9.4 アクセスコントロール──外部からの使用の制限
アクセスレベル──公開範囲の分類
指定方法
デフォルトのアクセスレベル
モジュールヘッダ──モジュール外から参照可能なインタフェース
閲覧方法
モジュールヘッダに記述される情報
ドキュメントコメント──コードの意図や使用方法の説明
9.5 まとめ
第10章 型の設計指針
10.1 クラスに対する構造体の優位性
参照型のクラスがもたらすバグ
値型の構造体がもたらす安全性
コピーオンライト──構造体の不要なコピーを発生させない最適化
クラスを利用するべきとき
参照を共有する
インスタンスのライフサイクルに合わせて処理を実行する
10.2 クラスの継承に対するプロトコルの優位性
クラスの継承がもたらす期待しない挙動
プロトコルによるクラスの継承の問題点の克服
クラスの継承を利用するべきとき
複数の型の間でストアドプロパティの実装を共有する
10.3 オプショナル型の利用指針
Optional<Wrapped>型を利用するべきとき
値の不在が想定される
ただし,必然性のないOptional<Wrapped>型のプロパティは排除する
ImplicitlyUnwrappedOptional<Wrapped>型を利用するべきとき
初期化時にのみ値が決まっていない
サブクラスの初期化より前にスーパークラスを初期化する
Optional<Wrapped>型とImplicitlyUnwrappedOptional<Wrapped>型を比較検討するべきとき
10.4 まとめ
第11章 イベント通知
11.1 Swiftにおけるイベント通知のパターン
11.2 デリゲートパターン──別オブジェクトへの処理の委譲
実装方法
命名規則
弱参照による循環参照への対処
利用するべきとき
2つのオブジェクト間で多くの種類のイベント通知を行う
外部からのカスタマイズを前提としたオブジェクトを設計する
11.3 クロージャ──別オブジェクトへのコールバック時の処理の登録
実装方法
キャプチャリスト──キャプチャ時の参照方法の制御
weakキーワード──メモリ解放を想定した弱参照
unownedキーワード──メモリ解放を想定しない弱参照
キャプチャリストの使い分け
escaping属性によるselfキーワードの必須化
typealiasキーワードによる複雑なクロージャの型への型エイリアス
利用するべきとき
処理の実行とコールバックを同じ箇所に記述する
11.4 オブザーバパターン──状態変化の別オブジェクトへの通知
実装方法
Selector型──メソッドを参照するための型
利用するべきとき
1対多のイベント通知を行う
11.5 まとめ
第12章 非同期処理
12.1 Swiftにおける非同期処理
12.2 GCD──非同期処理のための低レベルAPI群
実装方法
ディスパッチキューの種類
既存のディスパッチキューの取得
新規のディスパッチキューの生成
ディスパッチキューへのタスクの追加
利用するべきとき
シンプルな非同期処理を実装する
12.3 Operation,OperationQueueクラス──非同期処理を抽象化したクラス
実装方法
タスクの定義
キューの生成
キューへのタスクの追加
タスクのキャンセル
タスクの依存関係の設定
利用するべきとき
複雑な非同期処理を実装する
12.4 Threadクラス──手動でのスレッド管理
実装方法
利用するべきとき
特になし
12.5 非同期処理の結果のイベント通知
12.6 まとめ
第13章 エラー処理
13.1 Swiftにおけるエラー処理
13.2 Optional<Wrapped>型によるエラー処理──値の有無による成功,失敗の表現
実装方法
利用するべきとき
値の有無だけで結果を十分に表せる
13.3 Result<T, Error>型によるエラー処理──列挙型による成功,失敗の表現
実装方法
利用するべきとき
エラーの詳細を提供する
成功か失敗のいずれかであることを保証する
非同期処理のエラーを扱う
13.4 do-catch文によるエラー処理──Swift標準のエラー処理
実装方法
Errorプロトコル──エラー情報を表現するプロトコル
throwsキーワード──エラーを発生させる可能性のある処理の定義
rethrowsキーワード──引数のクロージャが発生させるエラーの呼び出し元への伝播
tryキーワード──エラーを発生させる可能性のある処理の実行
try!キーワード──エラーを無視した処理の実行
try?キーワード──エラーをOptional<Wrapped>型で表す処理の実行
defer文によるエラーの有無に関わらない処理の実行
利用するべきとき
エラーの詳細を提供する
成功か失敗のいずれかであることを保証する
連続した処理のエラーをまとめて扱う
エラー処理を強制する
13.5 fatalError(_:)関数によるプログラムの終了──実行が想定されていない箇所の宣言
実装方法
Never型──値を返さないことを示す型
利用するべきとき
想定外の状況ではプログラムを終了させる
13.6 アサーションによるデバッグ時のプログラムの終了──満たすべき条件の宣言
実装方法
assert(_:_:)関数──条件を満たさない場合に終了するアサーション
assertionFailure(_:)関数──必ず終了するアサーション
コンパイルの最適化レベル──デバッグとリリースの切り替え
利用するべきとき
デバッグ時に想定外の状況を検出する
リリース時は想定外の状況でもプログラムの実行を継続する
13.7 エラー処理の使い分け
13.8 まとめ
第14章 実践的なSwiftアプリケーション──Web APIクライアントを作ろう
14.1 GitHub Search APIクライアントを作ろう
14.2 実装の下準備
API仕様と動作の確認
Xcodeプロジェクトの作成
実装方針の確認
14.3 API仕様のモデル化
レスポンス──サーバ上のリソースの表現
構造体の定義
JSONから構造体へのマッピング
プロトコルによるイニシャライザの共通化
ジェネリック型による検索結果の表現
エラー──APIクライアントで発生するエラーの表現
エラーの分類
エラーを表すレスポンスのモデル化
リクエスト──サーバに対する要求の表現
ベースURLとパスの定義
HTTPメソッドの定義
パラメータの定義
リクエストとレスポンスの紐付け
リポジトリ検索APIの実装
14.4 APIクライアント──Web API呼び出しの抽象化
FoundationのHTTPクライアント
URLRequest型──リクエスト情報の表現
HTTPURLResponse型──HTTPレスポンスのメタデータ
URLSessionクラス──HTTP経由でのデータの取得
API仕様をモデル化した型とFoundationの型の変換
リクエストを表す型のURLRequest型へのマッピング
Data型とHTTPURLResponse型のレスポンスを表す型へのマッピング
APIクライアントの構成要素間の接続
HTTPクライアントの実装
APIクライアントのインタフェースの定義
HTTPリクエストの送信
HTTPレスポンスの処理
14.5 プログラムの実行
エントリポイントの準備
実行ファイルの作成と実行
14.6 まとめ
第15章 SwiftからObjective-Cを利用する
15.1 SwiftからObjective-Cを利用する目的
15.2 SwiftからObjective-Cを利用するケース
Objective-Cで実装されたライブラリを使用する
Objective-Cで実装されたプログラムにSwiftのコードを追加する
15.3 SwiftからObjective-Cを利用する方法
ブリッジングヘッダの作成
モジュールのインポート
15.4 SwiftからObjective-Cランタイムを利用する方法
Objective-Cクラスの継承
NSObjectクラスの継承
objc属性──Objective-Cから参照可能にする属性
dynamicキーワード──動的ディスパッチを必須にするキーワード
15.5 Swiftから利用しやすく安全なObjective-Cのコード
ライトウェイトジェネリクス──コレクションの要素の型の指定
Swift側でのメリット
__kindofキーワード──特定の型のサブクラスの表現
null許容性アノテーション──Null値を取り得るかの指定
Objective-CとSwiftでのnilの違い
null許容性アノテーションの属性
関数への適用
特定の範囲への適用
id型はできるだけ利用しない
instancetypeキーワードの利用
ライトウェイトジェネリクスの利用
プロトコルに準拠したid型の利用
Objective-Cはあくまで動的な言語であることに注意する
15.6 両言語でのイニシャライザの対応関係
イニシャライザ
クラスファクトリメソッドとイニシャライザ
15.7 両言語での型の対応関係
数値
構造体
文字列
コレクション
配列
集合
辞書
ブロックとクロージャ
15.8 Objective-CからSwiftを利用する方法
15.9 まとめ
あとがき
索引
著者プロフィール
(via Swift実践入門 ──直感的な文法と安全性を兼ね備えた言語|技術評論社)
出版社情報
目次情報
Swift実践入門 ──直感的な文法と安全性を兼ね備えた言語(WEB+DB PRESS plusシリーズ)|gihyo.jp … 技術評論社
正誤表、サンプルのダウンロード
サポートページ:Swift実践入門 ──直感的な文法と安全性を兼ね備えた言語:|技術評論社
著者紹介
石川洋資(いしかわようすけ)
大学在学中からiOSアプリ開発に取り組み,現在は株式会社メルカリに勤務するiOSエンジニア。APIKitやRxSwift ActionなどのSwift製ライブラリの開発に参加している。
西山勇世(にしやまゆうせい)
大学では文学を専攻するも,論理学を経て計算機科学に関心を持つようになり,プログラマを志す。クックパッド株式会社にて事業の海外展開に従事。文理の垣根を超えた,芸術・哲学・科学の関連性に関心がある。
近況報告bot (@yuseinishiyama) | Twitter
書評
まだ全部に目を通してないけど、本屋で立ち読みしたとき、第10章の「型の設計指針」を見て「参考になりそう!」と思いました。
→ クラスと構造体を使い分ける方法とか、よく分からなかったので。
本書は、いろいろな方がレビューされていました。
Swiftの使い方を理解して、iPhoneアプリの作成に活かしたいと思います。