【Swift】extensionとは?クラスや構造体の拡張方法
この記事からわかること
- Swiftのextensionとは?
- 構造体やクラス、プロトコルを拡張するには?
- 使用目的のメリット
index
[open]
\ アプリをリリースしました /
友達や家族の誕生日をメモ!通知も届く-みんなの誕生日-
posted withアプリーチ
Swiftのextensionの概要や使い方についてまとめていきます。
extensionとは?
参考文献: Extensions
Swiftには定義済みの構造体やクラス、列挙型、プロトコルの機能を拡張するためにextension
キーワードが用意されています。extensionとは日本語で「拡張/伸張」と言った意味を持ち、Swiftでも既存の機能を拡張するために使用されます。
使用方法は拡張したい構造体などにextension
キーワードを付与するだけです。
extension School : Identifiable {
//
}
自身で定義したものに限った話ではなくStringやViewなど標準ライブラリに組み込まれているクラスなどにも拡張して機能を持たせることができます。
拡張できる機能
拡張できる機能はあらかじめ制限されており以下の通りのようです。
- ストアドプロパティ(タイプ)
- コンピューテッドプロパティ(インスタンス)/コンピューテッドプロパティ(タイプ)
- インスタンスメソッド/タイプメソッド
- インスタンスメソッド/タイプメソッド
- イニシャライザ
- プロトコルへの準拠
- サブスクリプト
- ネストされた型
extension Image {
// ストアドプロパティ(タイプ)
static var storedType:String = "Hello World"
// コンピューテッドプロパティ(インスタンス)
var computed:Int {
let result = 2 + 5
return result
}
// コンピューテッドプロパティ(タイプ)
static var computedType:Int {
let result = 2 + 5
return result
}
// イニシャライザ
init(){
}
// インスタンスメソッド
func method() {
}
// タイプメソッド
static func methodType() {
}
}
プロパティの中ではストアドプロパティ(インスタンス)のみ追加できないようです。追加しようとするとExtensions must not contain stored properties
というエラーが発生します。
extension Image {
// ストアドプロパティ(インスタンス)
var stored:String = "Hello World" // Error:Extensions must not contain stored properties
}
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 {
//
}
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。