0
2

【swift】delegateパターンとは

Posted at

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2