Swift勉強会

Swiftの学習日記

Swift実践入門

Swiftの文法書を購入しました。学びの多い1冊になりそうです!

 

Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)

Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 (WEB+DB PRESS plus)

 

 

 

目次

はじめに

謝辞

サポートページ

 

第1章 Swiftはどのような言語か

 1.1 言語の特徴
  静的型付き言語
  nilの許容性をコントロール可能
  型推論による簡潔な記述
  ジェネリクスによる汎用的な記述
  Objective-Cと連携可能

 

 1.2 macOSでの開発環境
  Xcodeのインストー
   コマンドラインでの実行方法
   REPLによるインタラクティブな実行
   swiftコマンドによるスクリプトの実行
   swiftcコマンドによる実行ファイルの作成
  Playgroundでの実行方法
   Playgroundファイルの作成
   エラーや警告の表示
   アニメーションのプレビューなどのリッチな機能
  iOSmacOSアプリケーションとしての実行方法
   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製ライブラリの開発に参加している。

GitHub:ishkawa

ishkawa (@_ishkawa) | Twitter


西山勇世(にしやまゆうせい)

大学では文学を専攻するも,論理学を経て計算機科学に関心を持つようになり,プログラマを志す。クックパッド株式会社にて事業の海外展開に従事。文理の垣根を超えた,芸術・哲学・科学の関連性に関心がある。

GitHub:yuseinishiyama

近況報告bot (@yuseinishiyama) | Twitter

 

書評

まだ全部に目を通してないけど、本屋で立ち読みしたとき、第10章の「型の設計指針」を見て「参考になりそう!」と思いました。

→ クラスと構造体を使い分ける方法とか、よく分からなかったので。

 

本書は、いろいろな方がレビューされていました。

 

ez-net.jp

 

karino2.livejournal.com

 

starhoshi.hatenablog.com

 

Swiftの使い方を理解して、iPhoneアプリの作成に活かしたいと思います。