Swift Delegateを理解する

Delegate(委譲)とは

今回はデザパタからは一旦離れて、Delegateを理解します。

何故かと言うと、Adapterパターンの手法の中で「委譲」が出てきて、「そういえばDelegateって理解が曖昧だったかも〜」と思ったからですね。

ずばり、Delegateとは処理を任せるです。

なぜ、Delegateするのか

例えば、func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCellメソッド

この関数はUITableVIewDelegateのメソッドTableViewにどんなCellを表示するかを指定するメソッドです。

なんでTableViewがこのメソッドDelegateメソッドにしているかというと表示するCellはControllerに指定してもらったほうが良いからです。

Viewを担うTableViewが何を表示するか決めるようとするとModelと密結合になってしまったり、TabaleVIewの再利用性が低くなってしまいます。

案件

今回はこんなシチュエーションを想定します。

  • Idolクラス(カメラマンにポーズを決めてもらいたい)
  • IdolDelegate(「写真を取るときにポーズを指定してね」と教える)
  • CameraManVIewController(アイドルの写真を撮る)

実装

IdolDelegate

Delegateするためには、処理を委譲してもらうクラスに、なにを実装すればいいかを教えるProtocolを使います。

import Foundation
protocol IdolDelegate: NSObjectProtocol {
    
    func takePicture() -> String?
}

Idol

Delegateしてもらうクラス

Delegateメソッドで返してもらったポーズをとります

import Foundation

class Idol :NSObject{
    
    var delegate: IdolDelegate?

    func pose() {
        if let poseName = self.delegate?.takePicture() {
            print("アイドルは\(poseName)のポーズをした")
        }
    }
}

CameraManViewController

アイドルのDelegateMethodを使ってポーズを決めます

import UIKit

class CameraManViewController: UIViewController, IdolDelegate {
        
    var poseName: String?
    let idol = Idol()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
        
        self.idol.delegate = self
        self.designatePose("ピース")
        
        idol.pose()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    // MARK: - Private Method
    func designatePose(poseName: String) {
        self.poseName = poseName
    }
    
    // MARK: - Delegate Method
    func takePicture() -> String? {
            return self.poseName
    }
}

結果

アイドル「ポーズを指定してね!!」

カメラマン「デュフっ、ピースして欲しいコポォ!!!」

アイドル「はい!(ピース)」

カメラマン「(パシャっ)」

って感じになりました。

Delegateすると幸せになるのか、何をDelegateするのかを考えて実装すると結構楽しいかもしれないですね!