詳解Swift 第5版
SBクリエイティブ
著者:荻原 剛志
はじめに
目次
CHAPTER01 Swiftでプログラミング
1.1 データ型と変数
Swiftのデータ型
基本的なデータ型
数値型のリテラル
変数と定数
変数の定義
定数の定義
型変換
文字列
print関数
配列
配列要素へのアクセス
演算子
演算子の記述に関する注意
識別子
型パラメータ
モジュールのインポート
名前空間
コメント
1.2 制御構文
文
if文
while文
repeat-while文
for-in文
switch文
ラベル付きのループ文
ラベル付きのif文、switch文
do文
1.3 簡単な実行方法
プレイグラウンド
Swift処理系をコマンドラインから使う
SDKの設定
Linuxでの設定
コマンドラインから対話的に利用する
ソースプログラムをコンパイルする
ソースコードを解釈実行する
複数のソースファイルからなるプログラムをコンパイルする
CHAPTER02 関数
2.1 関数定義の基本
関数定義の概要
returnの省略
引数ラベル
引数ラベルの指定と省略
仮引数の省略
下線の特殊な用法
2.2 関数定義におけるさまざな設定
inout引数
関数の引数に既定値を指定する
引数の値は関数内で変更できない
返り値を使わない場合を許す指定
関数内の関数
2.3 オーバーロード
オーバーロードとは
引数ラベルを使ったオーバーロードの定義
関数の書き表し方
2.4 タプル
タプルの概要
タプルと代入操作
タプルを返す関数
キーワード付きのタプル
キーワード付きのタプルと代入
キーワード付きのタプルを返す関数
タプルの比較
2.5 Swiftの演算子
演算子の優先度
演算子の結合規則
剰余演算子
論理演算子
ビット演算子とシフト演算子
オーバーフロー演算子
2.6 演算子の定義
演算子の宣言
演算子として使える文字列
二項演算子の定義
単項演算子の定義
引数の変数の値を変更するには
優先度グループの定義
優先度の指定について
CHAPTER03 構造体
3.1 構造体の定義
定義の概要
構造体の初期化
全項目イニシャライザ
構造体を定数に代入した場合
構造体の定数プロパティ
イニシャライザの定義
複数個のイニシャライザを定義する
他の構造体を含む構造体
付属型
3.2 メソッド
インスタンスに対するメソッドの定義
構造体の内容を変更するメソッド
タイプメソッド
イニシャライザとメソッド
構造体の内部での演算子の定義
3.3 プロパティ
プロパティの種類
タイププロパティ
格納型プロパティの初期値を式で設定する
計算型プロパティ
関数のinout引数にプロパティを渡す
計算型プロパティに対する特殊な設定
プロパティオブザーバ
3.4 添字付け
添字付けとは
型への添え字付け定義
添字付けのバリエーション
呼び出しの最適化
CHAPTER04 オプショナル
4.1 オプショナル型
オプショナル型とnil
オプショナル型の値を開示する
条件判定とオプショナル型
4.2 オプショナル束縛構文
if-let文
オプショナル束縛と条件式
guard文
nil合体演算子
オプショナル型と関数
関数のinout引数に指定する
readLine関数
4.3 有値オプショナル型
有値オプショナル型とは
オプショナル型を要素とする配列
有値オプショナル型と関数
4.3 失敗のあるイニシャライザ
イニシャライザで正しく処理ができない場合
失敗のあるイニシャライザの定義
CHAPTER05 プロトコル
5.1 プロトコルとは
基本的な考え方
プログラムの構成概念としてのプロトコル
プロトコルを採用した定義例
5.2 プロトコルの宣言
宣言の概要
メソッドの宣言と定義
プロパティの宣言と定義
型としてのプロトコル
プロトコルの継承
プロトコルの合成
プロトコルの使用例
5.3 プロトコルと付属型
付属型の宣言
自分自身を表すSelf
型パラメータに制約を指定する
付属型が適合するプロトコルを指定
5.4 代表的なプロトコルの例
大小比較のためのプロトコルComparable
列を表すプロトコルSequence
添字で要素にアクセスできるCollection
5.5 値型データの共有とコピー
Copy-On-Write
値がデータの共有
CHAPTER06 基本的なデータ型
6.1 範囲型とStride型
範囲演算子に関する型の概要
片側範囲型と範囲演算子
範囲型のプロパティとメソッド
乱数の生成
ストライド型の概要
ストライド型とプロトコルStrideable
Stride型の概要
for-in文とプロトコルSequence
6.2 配列
コレクションの内容を変更する
配列の部分的な置換
部分配列の型
配列のイニシャライザ
配列のプロパティとメソッド
配列の比較
可変個の引数が利用できる関数
多次元配列
6.3 文字列と文字
String型のイニシャライザ
Character型
UnicodeScalar型
合成された文字とCharacter型
文字列から文字を取り出す
文字列のプロパティ
文字列のメソッド
文字列の添字付け
指定位置の文字および部分文字列の取り出し方
Foundationフレームワークの機能
複雑な文字列埋め込み
複数行にわたる文字列リテラルの記述方法
エスケープ文字を使わない文字列の表現
文字コードのコレクションとして文字列を操作する
文字の属性を利用する
6.4 辞書
辞書の型宣言と初期値
辞書へのアクセス
辞書の比較
辞書のプロパティ
辞書の添字付け検索の既定値
辞書とfor-in文
辞書のメソッド
CHAPTER07 パターン
7.1 タプルとswitch文
タプルをcaseで使う
switch文でwhere節を使う
オプショナル型をswitch文で使う
7.2 列挙型
シンプルな列挙型
メソッドの定義
値型の列挙型
列挙型に対するメソッドとプロパティ
列挙型のイニシャライザとタイプメソッド
列挙型のケースをすべて含むコレクション
7.3 共用型の列挙型
共用型の列挙型の概要
if-case文
for-in文でcaseパターンを使う
プロトコルの採用
列挙型の付加情報を書き換えるメソッド
再帰的な列挙型
オプショナル型と列挙型
7.4 パターンマッチ
パターンマッチとは
パターンマッチのルール
パタンマッチ演算子
CHAPTER08 クラスと演算子
8.1 クラス定義
クラスの概要
クラスの継承
継承によるクラス定義の例
動的結合とキャスト
クラスメソッドとクラスプロパティ
継承とメソッド呼び出し
8.2 イニシャライザ
指定イニシャライザと簡易イニシャライザ
初期化の手順と守るべきルール
クラス継承の例題
初期化は結局どう記述すればよいのか
イニシャライザの継承
失敗のあるイニシャライザと継承
必須イニシャライザ
8.3 継承とサブクラスの定義
プロパティの継承
添字付けの継承
継承とプロパティオブザーバ
上書き定義をさせない指定
クラスとプロトコル
クラス定義のためのプロトコル
8.4 クラスと型
キャスト演算子
分岐構文とキャスト演算子
メタタイプとダイナミックタイプ
継承とSelf
プロトコルとクラスの合成
継承と型推論
8.5 解放時処理
解放時処理とデイニシャライザ
デイニシャライザの定義
デイニシャライザを使った例
CHAPTER09 メモリ管理
9.1 参照型データとARC
リファレンスカウンタの概念
ARCによるメモリ管理
9.2 強い参照の循環
インスタンスが解放できない場合
弱い継承
非所有参照
Xcodeによる参照関係の表示
9.3 オプショナルチェーン
オプショナル型の値を連続利用する場合
オプショナルチェーンとは
オプショナルチェーンでメソッドを呼び出す
オプショナルチェーンの型
値を返さないメソッドの場合
オプショナルチェーンに対する代入
9.4 キーパス
キーパスとは
キーパス式の記法
キーパスによる値の操作
キーパスを使った表記の意義
9.5 メモリアクセスの安全性
CHAPTER10 拡張
10.1 拡張の宣言
拡張の概要
システムの既存の型に対する拡張定義の例
拡張定義とイニシャライザ
拡張定義と継承に関する注意
10.2 拡張定義とプロトコルへの適合
プロトコルへの適合
プロトコルに適合するための定義がすでに存在する場合
10.3 プロトコル拡張
プロトコルの拡張定義とは
プロトコル拡張に記述できること
標準ライブラリにおけるプロトコル拡張
プロトコル拡張に型による制約をつける
10.4 集合とプロトコル
ハッシュ値による検索の高速化
集合の型宣言と初期値
要素へのアクセス
プロトコルHashableを採用する
集合演算
プロトコルOptionSet
CHAPTER11 エラー処理
11.1 エラー処理構文
エラーへの対応
エラーの発生
エラーの伝播と捕捉
エラーを投げる関数の呼び出し方
do〜catch構文
try?とtry!
エラーのあるオプショナル型の関数とtry?
Result型の利用
11.2 処理の中断と後始末
defer文の概要
defer文の動作
defer文とARCの動作
11.3 アクセス制御
アクセス制御の5つの種類
アクセス制御の指定
クラス継承とアクセス制御
プロトコルとアクセス制御
拡張定義のアクセス制御について
プロパティのアクセス制御
11.4 アサーションとテスト
assert
アサーションのための関数
関数assertの引数とデバッグ用リテラル
戻ってこない関数
ユニットテスト
UIテスト
関数debugPrint
11.5 利用可能条件とコンパイラ制御文
利用可能条件を指定する属性
利用可能条件の詳細な指定
利用可能条件に合致する実装を用意する
条件付きコンパイル
11.6 インスタンスのシリアライズ
シリアライズとは
シリアライズのためのプロトコル
JSONデータの読み書き
JSONデータ形式を指定する
プロパティリストの読み書き
キー付きのシリアライズ
エンコーダの呼び出しとコンテナ
CHAPTER12 クロージャ
12.1 クロージャの宣言
クロージャの概要
クロージャの仮引数と返り値の型宣言
クロージャと関数の型
オーバロードされた関数を区別するには
クロージャの複雑な型宣言
12.2 変数のキャプチャ
キャプチャとは
クロージャが個別にローカル変数をキャプチャする場合
複数のクロージャが同じローカル変数をキャプチャする場合
クロージャが参照型の変数をキャプチャする場合
ネスト関数とクロージャ
メソッドとクロージャ
関数とクロージャ
キャプチャリスト
12.3 クロージャの使い方と記法
引数リストの省略
引数リスト自体の省略
配列の整列
配列要素の選択
接尾クロージャ
エラーを投げるクロージャ
再通報する関数
12.4 クロージャと強い参照の循環
キャプチャによる強い参照
キャプチャリストによる解決
非所有参照による解決
関数の引数にクロージャを渡す場合
12.5 クロージャの応用
@autoclosureについて
短絡評価をする演算子の定義
既定値が指定できる添字付け定義
遅延格納型プロパティ
ファイルの属性を遅延評価する例題
CHAPTER13 ジェネリクス
13.1 ジェネリクスの概要
ジェネリクスとは
ジェネリック関数の例
ジェネリックな型の例
プロトコルと付属型
13.2 ジェネリック関数の定義
ジェネリック関数の定義
型パラメータの書き方
プロトコルによる制約のあるジェネリック関数
配列とシークエンスを扱う関数
型パラメータの推論
型パラメータのある添字付け定義
13.3 ジェネリクスによる型定義
型パラメータを持つ構造体の定義
ジェネリックなデータ型と型パラメータの推論
拡張定義の条件に型パラメータを使う
プロトコルを利用した型自体に対する制約を記述する
ジェネリックなクラスを定義する
型パラメータを持つtypealias
13.4 不透明型
プロトコルを返り値の型として使う
不透明型の性質
不透明型の利用方法
13.5 シークエンス操作
シークエンスに対する処理
filter – 条件を満たす要素を取り出す
map – 各要素を処理した結果を配列として得る
reduce – 各要素を連続的に処理して1つの値を得る
sorted – 並び替え
dorEach – 繰り返し処理の適用
enumerated – 通し番号付きのタプルを得る
zip – 2つのシークエンスをタプルにまとめる
repeatElement – 同じ内容を複数個含むシークエンス
sequence – 要素を次々に生成する遅延評価型シークエンス
lazy – 遅延評価するシークエンス
シークエンスを使ったプログラム例
CHAPTER14 メモリへのアクセスとポインタ
14.1 互換なデータ型とポインタ
C言語の単純型とSwiftの型
データのバイト数を調べる
アンセーフポインタ
変数を用意して関数の結果を書き込む
配列を用意して関数に結果を書き込む
C関数のポインタ引数に関するルール
ポインタを使ってメモリにアクセスする
返されたポインタから値を取り出す
コマンドラインの引数リストにアクセスする
14.2 Data型とポインタ
Data型の概要
Data型でファイルを読み書きする
Data型でバイト列を操作する
UnsafeBufferPointer
メモリの動的な獲得
アンセーフポインタでDataのバイト列を操作するには
14.3 Objective-Cとの対応付け
Objective-CのオブジェクトとSwiftの型
数値と数値オブジェクト
FoundationフレームワークとSwiftの型定義
コレクション
CoreGraphicsの構造体
Core Foundation
Objective-Cのプロトコルを利用する
14.4 インスタンスのシリアライズ
14.4 列挙型とその他のデータ型
シリアライズとは
シリアライズのためのプロトコル
JSONデータの読み書き
JSONのデータ形式を指定する
プロパティリストの読み書き
キー付きのシリアライズ
エンコーダの呼び出しとコンテナ
CHAPTER15 カスタム属性とDSL記法
15.1 プロパティラッパ
プロパティラッパの概要
簡単なプロパティラッパの定義
カスタム属性
プロパティラッパのカスタムイニシャライザ
ストレージプロパティへのアクセス
射影値
プロパティラッパに関する制約
15.2 動的な関数呼び出しとメンバ探索
データの並びをメソッド呼び出しとみなす
引数ラベル付きのメソッド呼び出しのように振る舞う
データ型のメンバを動的に呼び出す
タイププロパティで動的なメンバを実装する
15.3 関数ビルダ
関数ビルダとDSL記法
関数ビルダの基本的な定義方法
関数ビルダの使い方
関数構築メソッドのオーバーロード定義
イニシャライザを利用する
if構文とdo構文
CHAPTER16 GUIとの連携
16.1 SwiftUI
SwiftUIとDSL記法
SwiftUIのViewはどの様に定義されているのか
関数ビルダ型ViewBuilderの概要
部品の操作に対応する動作の記述と値の変更
State型とBinding型による動的な値の共有
16.2 ターゲット&アクション・パラダイム
Objective-Cの動作モデルとセレクタ
セレクタを使ったメソッド呼び出し
ターゲット&アクション・パラダイム
APPENDIX
APPENDIX A Swiftの標準ライブラリ
A.1 プロトコル
A.1.1 比較とハッシュ
A.1.2 整数型に関するプロトコル
A.1.3 実数型に関するプロトコル
A.1.4 ExpressibleBy~のグループ
A.1.5 シークエンスとイテレータ
A.1.6 コレクション
A.1.7 遅延評価を行うシークエンスとコレクション
A.1.8 すべての列挙ケースをコレクションとして提供する
A.1.9 実体を持つ型を表すプロトコル
A.1.10 集合演算のプロトコル
A.1.11 文字列に関するプロトコル
A.1.12 シリアライズのプロトコル
A.1.13 エラーを表すプロトコル
A.1.14 乱数ジェネレータのプロトコル
A.1.15 CVarArg:Cの可変長引数
A.2 型
A.2.1 特殊な型
A.2.2 Bool
A.2.3 整数
A.2.4 実数
A.2.5 文字列
A.2.6 文字を表す型
A.2.8 その他の型
A.3 ジェネリック型
A.3.1 Array
A.3.2 Dicitionary
A.3.3 Set
A.3.4 Optional
A.3.5 範囲型
A.3.6 ストライド型
A.3.7 キーパス型
A.3.8 Result型
A.3.9 その他のコレクション
A.3.10 その他の型
A.4 ポインタ型
A.4.1 UnsafePointer
A.4.2 UnsafeRawPointerとUnsafeMutableRawPointer
A.4.3 UnsafeBufferPointer
A.4.4 UnsafeRawBufferPointerとUnsafeMutableRawBufferPointer
A.4.5 ポインタに関連するその他の型
A.5 関数
A.5.1 演算
A.5.2 入出力
A.5.3 デバッグ
A.5.4 メモリ
A.5.5 ポインタと関数
A.5.6 シークエンスの生成
A.5.7 その他
A.6 属性
A.6.1 @available
A.6.2 @discardableResult
A.6.3 呼び出しの最適化
A.6.4 @warm_unqualified_access
A.6.5 @unknown
A.6.6 クロージャに関する属性
A.6.7 Objective-Cとの関連を表す属性
A.6.8 Interface Builderの属性
A.6.9 @convention
A.6.10 @testable
A.6.11 プロパティの動作を制御する属性
A.6.12 動的な関数呼び出しとメンバ探索
A.6.13 アプリケーションに関する属性
APPENDIX B 文書化コメント
Xcode向けのコメント
文書化コメント
APPENDIX C デバッガLLDBの簡単な使い方
LLDBとは
REPLモードでの準備
コンパイルしたコードのデバッグ
コマンドのヘルプ
ブレークポイント
コマンドに別名を付ける
変数の値を表示する
ステップ実行
INDEX