Delegateってなんやねん(iOS App, Swift)
iOSアプリ作るにあたってまず引っかかるであろうDelegateという概念
委譲とは言うものの自分の思ってるイメージで正しいんやろかーって
わかっているようでわかっていない状況な人が多いと思うので
踏み入った話になる前の基本的な概念イメージをまとめてみました
環境
OS | Version |
---|---|
Mac OS | Mac OS X Yosemite |
Xcode | 7.1.1 |
Swift | 2.1 |
iOS | 9.1 |
基礎用語
用語 | 説明 |
---|---|
Delegate(デリゲート) | 委譲(今回のメイン題材) |
Segue(セグエ) | 画面遷移手法(昔で言うモーダルとかそういうViewControllerの遷移系をまとめたイメージ) |
Protocol(プロトコル) | 要約するとインターフェースのこと |
説明
説明の流れとしては
- 言葉で軽い説明
- 図で概念イメージ
- 実装と結びつけ
って感じ
軽い説明
任せたいことを定義しておいて委譲する感じ。
このClassには属する処理やねんけど、ここだけは他のClassにやってもらおう。(委譲)
人にやらせるんやから、やらせ方を定義しておかないと(Protocol)
以下はClassAがClassBに雑用を投げるがBには押印の権限が無いので押印処理だけはAに委譲するストーリー
図説
簡単な実装イメージ
Class A
import UIKit
/**
* ここが①
* 押印は俺にはできひんから任せるでー的な(委譲)
* protocolという形でいわばインターフェースのようなものを定義
*/
@objc protocol BViewControllerDelegate: NSObjectProtocol {
func push(sign: String)
}
class BViewController: UIViewController {
weak var delegate: BViewControllerDelegate?
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillDisappear(animated: Bool) {
super.viewWillDisappear(animated)
}
/**
* ここが④
* IBActionである必要は無いけど、例えば雑用の中で押印ボタンが押されたようなイメージ
*/
@IBAction func signButton(sign: String) {
delegate?.push(sign)
}
}
Class B
import UIKit
class MainViewController: UIViewController, BViewControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
/**
* ここが② (zatsuyouOshitsukeとperformSegueWithIdentifier)
* セグエで遷移して雑用を任せようとしてるところ
*/
@IBAction func zatsuyouOshitsuke(sender: AnyObject) {
performSegueWithIdentifier("segue",sender: nil)
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if(segue.identifier == "segue") {
let vc: BViewController = segue.destinationViewController as! BViewController
vc.delegate = self//③の「あ、困ったら俺呼べよ」の部分
}
}
/**
* ここが⑤
* 押印の仕方をProtocolに則って実装
*/
func setKey(sign: String){
print(sign)
}
}