【Swift】extensionとは?クラスや構造体の拡張方法

この記事からわかること
- Swiftのextensionとは?
- 構造体やクラス、プロトコルを拡張するには?
- 使用目的のメリット
index
[open]
\ アプリをリリースしました /
Swiftのextensionの概要や使い方についてまとめていきます。
extensionとは?
参考文献: Extensions
Swiftには定義済みの構造体やクラス、列挙型、プロトコルの機能を拡張するためにextension
キーワードが用意されています。extensionとは日本語で「拡張/伸張」と言った意味を持ち、Swiftでも既存の機能を拡張するために使用されます。
使用方法は拡張したい構造体などにextension
キーワードを付与するだけです。
extension School : Identifiable {
//
}
自身で定義したものに限った話ではなくStringやViewなど標準ライブラリに組み込まれているクラスなどにも拡張して機能を持たせることができます。
拡張できる機能
拡張できる機能はあらかじめ制限されており以下の通りのようです。
- ストアドプロパティ(インスタンス)/コンピューテッドプロパティ(インスタンス)/コンピューテッドプロパティ(タイプ)
- インスタンスメソッド/タイプメソッド
- イニシャライザ
- プロトコルへの準拠
- サブスクリプト
- ネストされた型
※インスタンスプロパティとは型のインスタンスに紐付く(インスタンス化しないと参照できない)プロパティでタイププロパティとはstatic
キーワードを付与したプロパティのことです。
extensionの使用目的とメリット
extensionを使用するメリット
- 既存クラスなどへの機能追加
- 可読性の向上
- 機能ごとの分離
- 他人が書いたコードとの分離
extensionを使う例としてUIKitではViewControllerクラスにUITableViewなどで使用するプロトコルを準拠させてテーブルビュー部分だけを切り離したり、Swift UIではViewを拡張して汎用性の高いモディファイアなどを追加したりすることができます。
おすすめ記事:【SwiftUI】modifier(モディファイア)の自作方法!カスタムモディファイア
プロトコルの拡張
例えば以下のようにViewControllerクラスにUITableView
で使用するUITableViewDataSource
とUITableViewDelegate
プロトコルを準拠させる場合を見てみます。
class ViewController: UIViewController {
//
}
extension ViewController:プロトコルA,プロトコルB {
//
}
この場合ViewController
クラスが拡張され各プロトコルに準拠したことでデリゲートメソッドが使用できるようになります。プロトコルを準拠させた場合は既存のクラスにもそのプロトコルが反映されるので定義元側でもデリゲートメソッドが使用できるようになります。
class ViewController: UIViewController {
// 定義元にも拡張して準拠させたプロトコルが反映される
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
}
//
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
}
}
extension ViewController:UITableViewDelegate,UITableViewDataSource {
//
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。
個人開発に限界を感じたらiOSに特化したプログラミングスクール「iOSアカデミア」も検討してみてください!無料相談可能で「最短・最速」でiOSエンジニアになれるように手助けしてくれます。