【2024年4月】弊社では、基本リモートワークで一緒に成長してくださるメンバーを広く募集させていただいております。 詳細はこちら

【Swift】デリゲートパターン(Delegate)について徹底的に解説

【Swift】デリゲートパターン(Delegate)について徹底的に解説
ふくしま

「雨が降る前の香りがする」って言ったら普通に引かれました。あるでしょ、香り、雨降る前の。株式会社メモリアインクのふくしまです!
さて今日は、Swiftにおけるデリゲート(Delegate)について解説していきます!

この記事を読んで分かること…
・Delegateパターンとは
・Delegateパターンの基本構成
・Delegateを使った実装方法
・Delegateパターンを使うメリット

目次

Delegateパターンとは?

Delegateパターンとは、Swiftの開発における設計手法の一つです。
delegateは英語で「代表者(人に任せる)」を意味し、「あるクラスから他のクラスに処理を任せる」ための手法を指します。
大まかな処理の流れは決まっているが、条件によって処理の内容を変えたいような場面などで有効な手段です。

ふくしま

例えば、食事をする振る舞いとして「咀嚼する」→「飲み込む」という処理は決まっているけど”どのように”咀嚼或いは飲み込むかを別のクラスに任せたい!みたいな感じですね〜
この例を使って、次項から具体的にコードを書いてみましょう!

Delegateを使った実装方法

Delegateパターンの構成として、大きく3つの役割が必要となります。

①Delegateプロトコル:
ここでは、任せたい処理をメソッドとして定義します。プロトコルなのであくまでもざっくりとした要件のみを記述します。(プロトコルについては、こちらで詳しく解説しています!)
ここで定義したメソッドを、デリゲートメソッドと呼びます。

protocol EatBehaveDelegate {
    // 咀嚼する
    func chew()
    // 飲み込む
    func swallow()
}

EatBehaveDelegateプロトコル内に任せたい処理である、func chew() ,func swallow() を定義しました。

②処理を任せるクラス
デリゲートメソッドを使用して、処理の流れを定義します。
ここでは、処理の流れのみの定義で具体的な処理は定義しません。

// 処理を任せる側のクラス
class EatBehave {
    var delegate: EatDelegate?
    
    func eat() {
        print("Start Eating!")
        if let dg = self.delegate {
            dg.chew()
            dg.swallow()
        }    else {
            print("I'm full")
        }
    }
}

処理を任せるクラスでは、”なんの処理を任せるのか”をプロパティとして保持します。
3行目で、①で要件定義したプロトコルを型としたプロパティvar delegate を定義しています。
5行目のeat() メソッドでデリゲートメソッドがキックされます。
7行目if let dg = self.delegate delegate プロパティのnilチェックを行っています。
delegate プロパティに処理を任されるクラスのインスタンスが存在する場合、その処理を実行します。

③処理を任されるクラス:
このクラスで、②でデリゲートメソッドがキックされた際の具体的な処理を定義します。

// 処理を任されるクラス
class Behave1: EatDelegate {
    func chew() {
        print("むしゃむしゃ")
    }
    func swallow() {
        print("ゴクリ")
    }
}

EatDelegateプロトコルを型としてBehave1クラスを定義することで、処理を任せるクラスが要求するメソッドが必ず定義されることが約束されます。

以上でDeligateを利用した実装は完了です!
早速実行してみましょう。

let eatBehave = EatBehave()
let behave1 = Behave1()

eatBehave.delegate = behave1
eatBehave.eat()

1行目、2行目で②・③をそれぞれインスタンス化しています。
4行目でEatBehavedelegate プロパティにBehave1 のインスタンスが格納され、②で説明したnilチェックにおいて、nil ではないことが確定するため、Behave1 特有の食事の振る舞いが出力されるはずです。

出力結果:

Start Eating!
むしゃむしゃ
ゴクリ

Delegateパターンのメリット

メリット①:疎結合

クラス同士の依存関係を最小限に抑えることができるため、各クラスが独立し、変更に柔軟になります。

メリット②:再利用性と拡張性の向上

特定のクラスに依存せずにコードを設計できるため、コードの再利用性が向上します。また、新しい機能を追加する際にも既存のコードを変更する必要が少なくなります。

まとめ

お疲れ様でした!
DelegateパターンはSwift 開発において、ソースコードの可読性を増すための有効な手段ですのでこの機会に是非ともマスターしてみてくださいね〜

ふくしま

この記事があなたのスキルアップに役立ったなら、次のキャリアステップを踏み出す絶好の機会かもしれません。エンジニアとしてのさらなる成長と挑戦を求めるなら、
未経験からIT・Webエンジニアを目指すなら【ユニゾンキャリア】
をオススメします!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメント一覧 (5件)

コメントする

目次