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

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

この記事からわかること

  • Swiftextensionとは?
  • 構造体クラスプロトコル拡張するには?
  • 使用目的メリット

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で使用するUITableViewDataSourceUITableViewDelegateプロトコルを準拠させる場合を見てみます。

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 {
  //
}

まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。

ご覧いただきありがとうございました。

searchbox

スポンサー

ProFile

ame

趣味:読書,プログラミング学習,サイト制作,ブログ

IT嫌いを克服するためにITパスを取得しようと勉強してからサイト制作が趣味に変わりました笑
今はCMSを使わずこのサイトを完全自作でサイト運営中〜

New Article

index