詳解Swift 第4版
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 関数定義の基本
関数定義の概要
引数ラベル
引数ラベルの指定と省略
仮引数の省略
下線の特殊な用法
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 有値オプショナル型
有値オプショナル型とは
オプショナル型を要素とする配列
有値オプショナル型と関数
関数のinout引数に指定する
4.3 失敗のあるイニシャライザ
イニシャライザで正しく処理ができない場合
失敗のあるイニシャライザの定義
CHAPTER05 プロトコル
5.1 プロトコルとは
基本的な考え方
プログラムの構成概念としてのプロトコル
プロトコルを採用した定義例
5.2 プロトコルの宣言
宣言の概要
メソッドの宣言と定義
プロパティの宣言と定義
型としてのプロトコル
プロトコルの継承
プロトコルの合成
プロトコルの使用例
5.3 プロトコルと付属型
付属型の宣言
自分自身を表すSelf
型パラメータに制約を指定する
付属型が適合するプロトコルを指定
5.4 代表的なプロトコルの例
大小比較のためのプロトコルComparable
列を表すプロトコルSequence
添字で要素にアクセスできるCollection
5.5 値型データの共有とコピー
Copy-On-Write
値がデータの共有
CHAPTER06 基本的なデータ型
6.1 範囲型とStride型
範囲演算子に関する型の概要
片側範囲型と範囲演算子
範囲型のインスタンスの生成
範囲型のプロパティとメソッド
Stride型の概要
Stride型とプロトコルStrideable
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
プロトコルとクラスの合成
継承と型推論
Objective-Cのクラスを継承
8.5 解放時処理
解放時処理とデイニシャライザ
デイニシャライザの定義
デイニシャライザを使った例
CHAPTER09 メモリ管理
9.1 参照型データとARC
リファレンスカウンタの概念
ARCによるメモリ管理
9.2 強い参照の循環
インスタンスが解放できない場合
弱い継承
非所有参照
Xcodeによる参照関係の表示
9.3 オプショナルチェーン
オプショナル型の値を連続利用する場合
オプショナルチェーンとは
オプショナルチェーンでメソッドを呼び出す
オプショナルチェーンの型
値を返さないメソッドの場合
オプショナルチェーンに対する代入
9.4 キーパス
キーパスとは
キーパスによる値の操作
CHAPTER10 拡張
10.1 拡張の宣言
拡張の概要
システムの既存の型に対する拡張定義の例
拡張定義とイニシャライザ
拡張定義と継承に関する注意
10.2 拡張定義とプロトコルへの適合
プロトコルへの適合
プロトコルに適合するための定義がすでに存在する場合
10.3 プロトコル拡張
プロトコルの拡張定義とは
プロトコル拡張に記述できること
標準ライブラリにおけるプロトコル拡張
プロトコル拡張に型による制約をつける
プロトコル拡張による多重継承
10.4 集合とプロトコル
ハッシュ値による検索の高速化
集合の型宣言と初期値
要素へのアクセス
集合演算
プロトコルOptionSet
CHAPTER11 エラー処理
11.1 エラー処理構文
エラーへの対応
エラーの発生
エラーの伝播と捕捉
エラーのある関数の呼び出し方
do〜catch構文
try?とtry!
エラーのあるオプショナル型の関数とtry?演算子
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 シークエンス操作
シークエンスに対する処理
filter – 条件を満たす要素を取り出す
map – 各要素を処理した結果を配列として得る
reduce – 各要素を連続的に処理して1つの値を得る
sorted – 並び替え
dorEach – 繰り返し処理の適用
enumerated – 通し番号付きのタプルを得る
zip – 2つのシークエンスをタプルにまとめる
repeatElement – 同じ内容を複数個含むシークエンス
lazy – 遅延評価するシークエンス
シークエンスを使ったプログラム例
CHAPTER14 C/Objective-Cとのデータ受け渡し
14.1 互換なデータ型とポインタ
C言語の単純型とSwiftの型
データのバイト数を調べる
アンセーフポインタ
Null許容性
変数を用意して関数の結果を書き込む
配列を用意して関数に結果を書き込む
C関数のポインタ引数に関するルール
ポインタを使ってメモリにアクセスする
返されたポインタから値を取り出す
コマンドラインの引数リストにアクセスする
T**型の引数の扱い
14.2 Data型とポインタ
Data型の概要
Data型でファイルを読み書きする
Data型でバイト列を操作する
UnsafeBufferPointer
メモリの動的な獲得
アンセーフポインタでDataのバイト列を操作するには
14.3 対応付けられたデータ型
数値と数値オブジェクト
FoundationフレームワークとSwiftの型定義
可変なインスタンスと不変なインスタンス
オブジェクト
文字列
配列
集合
辞書
NSValueとCoreGraphicsの構造体
Core Foundation
14.4 列挙型とその他のデータ型
列挙型
マクロNS_ENUMで定義された列挙型
マクロNS_OPTIONSで定義された列挙型
定義の集まりを取り込む
マクロ定義
共用体とビットフィールド
無名の構造体
関数ポインタ
C言語のブロックオブジェクト
Objective-Cのプロトコルを利用する
オプション項目のあるプロトコルを宣言する
CHAPTER15 Objective-Cとの連携
15.1 SwiftとObjective-Cをビルドする
Xcodeの新プロジェクトをSwiftで作る
Objective-Cの情報をSwiftから参照する
Objective-CのヘッダをSwiftのインタフェースとして見る方法
Swiftの情報をObjective-Cから参照する
15.2 Objective-Cのオブジェクトを使う
Objective-CとSwiftメソッドとイニシャライザ
Objective-CのクラスをSwiftから使う例
Objective-Cのプロパティに関する注意
Objective-Cのクラスを継承する
Swiftに見せる情報を変更する
エラー情報を返すメソッド
セレクタを使ったメソッド呼び出し
セレクタを使ったメソッド呼び出しから返り値を得る
15.3 SwiftのクラスをObjective-Cで使えるようにする
Swiftのクラスと@objc属性
Objective-Cに見せる名前を指定する
SwiftとObjective-Cのクラスを互いに使う例
15.4 GUI部品との連携
ターゲット&アクション・パラダイム
Cocoaバインディング
15.5 プレイグラウンド向けの言語仕様
プラットフォームに依存しない機能
色を簡便に表現する方法とその記法
画像を簡便に表現する方法とその記法
リソースを簡便に表現する記法
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 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 Stride型
A.3.6 キーパス型
A.3.7 その他の型
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 Objective-Cとの関連を表す属性
A.6.5 Interface Builderの属性
A.6.6 @convention
A.6.7 @testable
A.6.8 @NSCopy
A.6.9 アプリケーションに関する属性
A.6.10 その他の属性
APPENDIX B 文書化コメント
Xcode向けのコメント
文書化コメント
APPENDIX C デバッガLLDBの簡単な使い方
LLDBとは
REPLモードでの準備
コンパイルしたコードのデバッグ
コマンドのヘルプ
ブレークポイント
コマンドに別名を付ける
変数の値を表示する
ステップ実行
INDEX