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してもらうクラス
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 } }
結果
アイドル「ポーズを指定してね!!」
カメラマン「デュフっ、ピースして欲しいコポォ!!!」
アイドル「はい!(ピース)」
カメラマン「(パシャっ)」
って感じになりました。