デリゲートパターン
最近、Swiftを勉強していて、デリゲートパターンが よく使われているのでブログにまとめておきます。
デリゲートパターンとは
Delegateとは日本語で 委譲 を意味します。 日本語の意味する通り、デリゲートパターンとは 他者(他クラス)に規定した処理(Swiftではプロトコルが使われる)を委譲することを意味します。
code例
コード例は以下の通りとなります。
// プロトコルを宣言 protocol HouseWorkDelegate { func startHouseWork() func cleanRoom() func makeDish() func finishHouseWork() } // class Employer { var Servant:HouseWorkDelegate? = nil func doWork() { if let sv = self.Servant { sv.startHouseWork() sv.cleanRoom() sv.makeDish() sv.finishHouseWork() } else { print("今日は使用人がいないので家事をはじめます") print("掃除をします") print("料理を作ります") print("家事、終わります。自分で作る料理はうまくない") } } } class Servant : HouseWorkDelegate { func startHouseWork() { print("使用人が家事をはじめます") } func cleanRoom() { print("掃除をします") } func makeDish() { print("料理を作ります") } func finishHouseWork() { print("家事、終わります。美味しい料理ができました!") } } var employer = Employer() var servant = Servant() // 主人が家事をする employer.doWork() // 使用人が家事をする employer.Servant = servant employer.doWork()
解説
今回は家事を行う設計を書いています。 プロトコルでは家事を以下のメソッドを規定しています。
- startHouseWork()
- cleanRoom()
- makeDish()
- finishHouseWork()
ここで重要なのはメソッドを規定するだけで実際に処理を 委譲するのはどのクラスでも問題ないということです。 今回のケースではServantが委譲先ですが、プロトコルに規定した 関数を実装すれば、どんなクラスでも、どんな実装でも構いません。
Swiftではボタンアクションなどを作成することが多いですが、その際にはデリゲートパターンが効力を発揮します。 例えば、ボタンを押したら音が鳴る、ボタンを押して画面遷移などなど。