【swift】delegateパターンとは

iOSエンジニア

delegateパターン

delegateは日本語訳で「委譲」という意味だそうですが、
自分の理解のためにもdelegateパターンについてまとめようと思います。

delegateパターンとは?

delegateパターンとはオブジェクト間のイベント通知の一種です。
イベント通知は3種類に分けられます。

  1. デリゲートパターン
  2. クロージャ
  3. オブザーバパターン

デリゲートパターンはこの中の1種類に該当するものです。

イベント通知とは何か?

イベント通知とは、イベントの発生箇所となるオブジェクトが、他のオブジェクトにイベントの発生を伝えることです。
イベントというのは、アプリケーション内で発生するあらゆる事象のことになります。
例:UI要素のタップ、プロパティの値の変更

実装方法

コード例

        protocol GameDelegate: class{
        	var numberOfPlayers: Int { get }
        	func gameDidStart(_ game: Game)
        	func gameDidEnd(_ game: Game)
        }
        
        class TwoPersonGameDelegate: GameDelegate{
        	var numberOfPlayers: Int {return 2}
        	func gameDidStart(_ game: Game) {print("ゲーム開始")}
        	func gemeDidEnd(_ game: Game) {print("ゲーム終了")}
        }
        
        class Game {
        	weak var delegate: GameDelegate?
        
        	func start(){
        		print("プレイヤーの人数は\(delegate?.numberOfPlayers ?? 1)人です")
        		delegate?.gameDidStart(self)
        		print("プレイ中です")
        		delegate?.gameDidEnd(self)
        	}
        }
        
        let delegate = TwoPersonGameDelegate()
        let twoPersonsGame = Game()
        twoPersonsGame.delegate = delegate
        twoPersonGame.start()
        //実行結果
        プレイヤーの人数は2人です
        ゲーム開始
        プレイ中です
        ゲーム終了

実装手法

  • 任せる処理をプロトコルのメソッドとして宣言する
func gameDidStart(_ game: Game)
func gameDidEnd(_ game: Game)
  • デリゲート先のオブジェクトはそのプロトコルに準拠し、処理の委譲に応えられるようにする。
class TwoPersonGameDelegate: GameDelegate

命名方法

このコード例についてまとめると下記のようになります。

  • デリゲート元のオブジェクト名→Game
  • デリゲート先のオブジェクト名→TwoPersonGameDelegate

命名3規則

  1. メソッド名はデリゲート元のオブジェクト名から始め、続けてイベントを説明する
    gameDidStart
     →gameはデリゲート元のオブジェクト名
     →DidStartはイベント
    gameDidEnd
     →gameはデリゲート元のオブジェクト名
     →DidEndはイベント
  2. didやwillなどの助動詞を用いてイベントのタイミングを示す
  3. 第一引数にはデリゲート元のオブジェクトを渡す
    gameDidStart(_ game: Game)

命名規則を守ることによるメリット

  • メソッド名を見ただけで、誰が、いつ、どういう場合に呼ぶのか明確になる
  • 名前の衝突を回避できる
  • 利用する側が扱いやすい
    • 既存のCocoa,Cocoa Touchフレームワークと違和感なく協調させることができる

利用するべき時

  • 2つのオブジェクト間で多くの種類のイベント通知を行うとき
  • 外部からのカスタマイズを前提としたオブジェクトを設計する時

コメント

タイトルとURLをコピーしました