#この記事の対象者
・まずはDelegateの必要最低限のコードを知りたい。という方。
・一通り関連記事を読んだが
→ Delegate実装に「必要/不必要なコード」の区別がつかず難して挫折しそうな方
→ 必要なコードは分かったけど「記述場所」が掴めきれず困っている方
主に下の絵の様な(Delegate初実装時の私)状態のかた向けです。
#この記事の非対象者
Delegateについて深く理解したい方
Dlegateの利用方法/活用場面(どんな時に使うの?)を知りたい方
エンジニアとして現場で活躍している方(←の方は特に読まないでください)
##処理を任せる側のファイル
protocol NudeManDelegate {
func buyHuku()
}
class NudeMan {
var delegate: NudeManDelegate?
func cold() {
self.delegate?.buyHuku()
}
}
##コード解説
####protocol
class
やfunc
と同じ様にprotocol
と書かなければいけません。
急に登場したprotocol
が難しく感じますね!
【強敵protocolの倒し方】(難しさ緩和方法)
私は、処理を任せる時だけclassがprotocolに名前を変える。
と思う様にして難しさを緩和しました
####NudeManDelegate
( protocolの後につく名前 )
class名
と同じ様に任意で構いません。
補足
任意ですが、ホニャララDelegateと書かれるのが一般的です。
(Swiftが元から用意しているprotocol名もUITextFieldDelegate
など、○○Delegateと命名しています)
####protocol
の中身
ここは裸の男(任せる側)の「服買ってきて」にあたる部分です
今までは
func hoge()
の後に必ず { 何らかの処理 }
を書いていたと思いますが
今回のprotocol
の中には書きません
{ 何らかの処理 }
は任せる側に書きます。
####------ ↓ここからNudManクラスの中 ---------------
####var delegate: NudeManDelegate?
一瞬見慣れない事をやっている様に感じますが、
やっている事は
var sumpleClass: SumpleClass?
と同じです。
####self.delegate?.buyHuku()
このタイミングで処理を任せたい(服買ってきて!)という所に書きます。
今回はサンプルでFunc cold()
で処理を任せましたが
実際は、
ボタンがタップされたタイミング、何かの処理が終わった後、などで使われます。
処理を任せたいタイミングで
self.delegate?.buyHuku()
を実行しましょう。
##処理を任される側のファイル
Class Woman: UIViewController, NudeManDelegate {
var nudeMan: NudeMan?
override func viewDidLoad() {
super.viewDidLoad()
nudeMan = NudeMan()
nudeMan.delegate = self
}
func buyHuku() {
print("マフラー買ってきます")
}
}
####class Woman: UIViewController, NudeManDelegate
UItableView
を使った事がある人はUITableViewDelegate
で見た事がありますね。同じ様にNudeManDelegateもここに書きます。
(初めての方はここに書く物だと覚えて下さい)
nudeMan = NudeMan()
依頼する側のクラスをインスタンス化します。
(インスタンス化が分からない方は、とりあえず依頼する側のクラス名に()を付けて
変数に代入しましょう)
###nudeMan.delegate = self
NudeManクラスの依頼を「私が受ける!」と宣言しています
ん!?
NudeManクラス
のdelegate
の型はNudeManDelegate
なのに
何で代入できるんだ?と気づいたあなた!さすがです
ここがdelegate
の難しいポイントです
しかし今回の目的は「実装コードを知る」なので
「delegateを深く理解する」は一旦スルーしましょう
(テンプレと割り切るのも挫折しない1つの方法だと思います。)
どうしても気になる人用にちょっとだけ・・・
Womanクラス
と NudeMandelegate
は型違い(無関係)に見えますが
Womanクラス
は NudeMandelegate
を継承してViewControllerを実装しています。
なので代入できる。今回はこの程度で。
func buyHuku() { }
この中で依頼された側それぞれで何を買いに行くか決めます。
##あとがき
今回は、delegateで挫折しない為に
- Class-only Protocol
- 循環参照
- plotocol内のメソッドで引数も渡せる事
- プロパティも実装できる事
などなどあえて触れていない事がまだ沢山あります
この記事を足掛りに、さらに理解を深めて、頂ければ幸いです。
また、出来るだけ専門用語を使わず解説したつもりでしたが、記事内で出てきた用語、説明の仕方で、分かりにくい部分があれば遠慮なくご指摘下さい。
記事内画像: icons8 https://icons8.com/