Swift概念実践編


はじめに

iOSアプリケーション開発における概要・基礎・実践についてまとめてみました。

プログラミング言語の分類

世の中には様々なプログラミング言語があるが、その言語の選択をする方法としては、大きく以下の2つが考えられる。

  1. 「インタプリタ」や「コンパイラ」などの 処理系 による分類
  2. 「オブジェクト指向」や「関数型」などの パラダイム による分類

処理系は大きく3つの部分で構成されている。ソースコードから文法を「解釈・変換」する部分、よく使われる機能として事前に用意された「ライブラリ」、ソフトウェアを実際に動作・実行させる「環境」である。
一方、プログラミングにおける捉え方や考え方をパラダイムと呼び、大きく「命令型」と「宣言型」に分類される。

命令型(「どのように処理を行うか」に注目):手続き型、オブジェクト指向
宣言型(「その処理が何なのか」に注目):関数型、論理型

オブジェクト指向について

プログラムを手順ではなくて、モノの作成と操作として見る考え方。
すべてのものを「オブジェクト」として捉え、モノの要素と振る舞いとして考える見方。
▶︎https://eng-entrance.com/what-oop

オブジェクト指向の3大要素

1. カプセル化

オブジェクトの安全性を高めるために、オブジェクトのメンバーを保護すること。
※メンバ = オブジェクトのメソッド及び変数。

2. 継承

あるクラスを引き継いで新しいクラスを定義することできること。
この特徴があるおかげで、共通部分をまとめて、再利用することができる。

3. ポリモーフィズム(多態性)

オーバライドやオーバロードによって、メソッドを状況によって使い分けることができること。
※ オーバライド: 親クラスのメソッドを子クラスで上書きすること・
※ オーバロード: 同一クラス内で引数の違いによってメソッドの呼び分けること。

詳しいオブジェクト指向の解説はこちらを参照
▶︎https://qiita.com/tutinoco/items/6952b01e5fc38914ec4e

関数型(FRP: Functional Reactive Programming)について

「時間とともに変化する値」と「振る舞い」の関係を宣言的に記述するプログラミングの手法であり、宣言型プログラミングにおいて、時間軸の概念を特に重視したプログラムの考え方。

そして、このリアクティブプログラミングのライブラリとしてフレームワーク「Reactive Extensions」が台頭し、「ReactiveX」として定着し、その略称である「Rx」を各言語に移植した「Rx〇〇」と呼ばれる拡張ライブラリが誕生した。このRxが利用できるSwiftのライブラリがのちの後述する「RxSwift」である。

Swiftの概要

大きく5つの特徴がある。

  1. 静的型付き言語(型の決定をコンパイル時などの実行前段階で決定する言語)
  2. nilの許容性をコントロール可能(Optional型の使用)
  3. 型推論による簡潔な記述(代入値からコンパイラが型を推測)
  4. ジェネリクスによる汎用的な記述(特定の型に制限されない汎用的なプログラムを記述するための機能)
  5. Objective-Cと連携可能(Objective-Cと高い互換性があり、Cocoaの資産も利用可能)

Swiftの基礎

関数とクロージャ

関数

入力として引数、出力として戻り値を持つ、名前を持ったひとまとまりの処理。

クロージャ

スコープ内の変数や定数を保持した、再利用可能なひとまとまりの処理。関数と、その関数が定義されたスコープの組み合わせであるため、関数はクロージャの一種である。

Swiftの型の種類と構成要素

型の種類
  1. 構造体(struct)
  2. クラス(class)
  3. 列挙型(enum)
型の構成要素
1. プロパティ

型に紐づいた値(変数や定数)を指す。紐づく対象による分類として、
・インスタンスプロパティ(型のインスタンスに紐付く)
・スタティックプロパティ(型自身に紐付く)
が存在する。

また、値保持の有無による分類として、
・ストアドプロパティ(値を保持する)
・コンピューテッドプロパティ(値を保持せずにゲッタとセッタを用いて別のストアドプロパティなどから算出する)
が存在する。

2. メソッド

型に紐づいた関数(振る舞い)を指す。プロパティと同様に、紐づく対象による分類として、
・インスタンスメソッド(型のインスタンスに紐付く)
・スタティックメソッド(型自身に紐付く)
が存在する。

エクステンション

すでに存在している型に、プロパティやメソッドなどの型を構成する要素を追加するなど、型の拡張のことをエクステンションという。

イベント通知

UI要素のタップやプロパティの値の変更など、アプリケーション内で発生するあらゆる事象のことをイベントと呼ぶ。また、イベントの発生箇所となるオブジェクトが、他のオブジェクトにイベントの発生を伝えることをイベント通知と呼ぶ。

Swiftにおけるイベント通知パターンは大きく以下の3つである。
1. デリゲートパターン(別オブジェクトへの処理の移譲)
2つのオブジェクト間で多くの種類のイベント通知を行う時や外部からのカスタマイズを前提としたオブジェクトを設計する時に使用する。

  1. クロージャ(別オブジェクトへのコールバック時の処理の登録)
    処理の実行とコールバックを同じ箇所に記述したい時に使用する。

  2. オブザーバパターン(状態変化の別オブジェクトへの通知)
    一対多のイベント通知を行う時に使用する。
    Cocoaが提供するNotification型とNotificationCenterクラスを用いて実装する方法と、RxSwiftを導入したFRPとして実装する方法(これについては後述)がある。

非同期処理

実行中に別の処理を止めないことを非同期処理と呼ぶ。複数の処理を並列化することで効率の良いプログラムを実現するための非同期処理は、アプリケーションの応答性を高める上で欠かせない手法である。一方で、適切に実装しなければ、保守性が低いコードになりやすく、また、バグの温床になりがちであるので注意が必要である。

Swiftで非同期処理を行うには、以下の4つの方法がある。

  1. GCD(Grand Central Dispatch)を用いる方法
    シンプルな非同期処理を実装したい時に使用する。

  2. Operation、OperationQueueクラスを用いる方法
    複雑な非同期処理を実装したい時に使用する。

  3. Threadクラスを用いる方法
    コアライブラリのFondationはスレッドそのものをThreadクラスとして実装している。これを用いることで、スレッドの生成と制御をプログラマー自身で行うことができるが、この方法はあまり使わない。

  4. RxSwiftを導入して実装する方法

RxSwiftに関するリンク集

説明は省き、とてもわかりやすく優秀な記事がたくさんあるので、知りたいことに合わせてリンクに飛べるよう、リンクをまとめました。

RxSwiftでiOSアプリ開発~リアクティブプログラミングを導入する
▶︎https://codezine.jp/article/detail/11000

RxSwiftの基本的な仕組みを理解しよう
▶︎https://codezine.jp/article/detail/11051

RxSwift コードリーディング
▶︎https://www.slideshare.net/yukitakahashi3139241/rxswift-rxswift

MVVMモデルの設計
▶︎https://codezine.jp/article/detail/11296

RxSwiftの仕組みを利用して、MVVMモデルを導入しよう
▶︎https://codezine.jp/article/detail/11203

はるふさんがとてもわかりやすくRxSwiftの理解をまとめてくれた良記事
▶︎https://qiita.com/_ha1f/items/e16ddc6017c4ad807c3c

RxのHotとColdについて
▶︎https://qiita.com/toRisouP/items/f6088963037bfda658d3

マルチスレッドRxSwift
▶︎https://www.slideshare.net/yukitakahashi3139241/rxswift-rxswift-64155110

Hot変換についての理解
▶︎https://www.slideshare.net/yukitakahashi3139241/hot-64131190

各用語の定義集

プロトコル

型が特定の性質や機能を持つために必要なインターフェースを定義するためのもの。プロトコルが要求するインターフェースを型が満たすことを準拠と言う。

インターフェース

プログラム間で通信を行うときの方式を定めたもの(ここではソフトウェアインターフェースのことを指す)。
インターフェースは、型がどのようなプロパティやメソッドを持っているかを示す。
基本的にはつなぐもの、あるいはつなぐための方式を定めたものという認識でよい。
UI(ユーザインターフェース)、 API(アプリケーションプログラミングインターフェース)など。

モジュール

複数のソースコードを含む再利用可能かつ配布可能なプログラムの単位を指す。
他のプログラムへのインポートが可能で、Swiftでのモジュールは、プログラムの名前空間を区切る単位にもなっている。