Delegateを理解する
Swift:Delegateって謎すぎない???
今までずっと良くわからずにいたDelegateですが上記の記事を読んでやっと理解できた気がするので、噛み砕いてまとめてみます。
Delegateってそもそも何?
Delegateはデザインパターンの一つだそうです。
デザインパターンと聞くとGofのイメージが強いですが、それの一部だと思います(GofがDeleateパターンを提唱したわけではない)
処理の一部を他のクラスに移譲(おねがい)すること。
どんな時に使うの?
処理は毎回行われるが、その都度別の処理をしたい時に使うようです。
Delegateの説明に出てくるUITextFieldのreturnした時のtextFieldShouldReturnを例に考えてみます。
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
return true
}
上記のコードがよく見るreturnが押された時にキーボードを非表示にするコードです。
この例ではtextField君に対してキーボードを非表示にしろ!としています。
身近な例を見る
冒頭に貼った参考記事ではお使いを例にDelegateの説明をしていました
少し記事が古くそのままでは動かなかったので少し修正を加えました
protocol OnegaiDelegate:class {//頼み
func goOtsukai()//頼むこと(お使いに行け!)
}
class Parent {
weak var delegate: OnegaiDelegate!//頼みを持っている
func say() {
print("おーい、お使い行ってきてー")
delegate.goOtsukai()
}
}
class ChildA: OnegalDelegate { //Parentに頼まれた依頼を承認している。
func goOtsukai() {
print("行ってきます!")
}
}
class ChildB: OnegaiDelegate { //Parentに頼まれた依頼を承認している。
func goOtsukai() {
print("行ってまいります、母上!")
}
}
let myParent = Parent()
let myChild1 = Child1()
myParent.delegate = myChild1 //お使いに行ってもらう子供をChild1に指定。
myParent.say() //お使いを頼む
Protocol
protocolで移譲する処理を指定しています。
:class 演算子をつけていますが、protocolは通常class以外にもenumやstructにもつけることができます。
しかし、enumやstructはclassと違いメモリアドレスではなく値が入っています。
そのため弱参照のweakを使うことはできず、:classをつけないとエラーになります。
Parentクラス
parentクラスはおつかいをお願いする変数を持っています
sayメソッドでお使いをお願いする変数(ここでは子供AかBのどちらか)の持っているgoOtsukaiメソッドで実行しています。
ChildA, ChildBクラス
ChildAくらすとChildBクラスは両方ともOnegaiDelegateに準拠しています。
そのため内部にgoOtsukai関数を持っています。
通常のアプリ開発では多くの場合ViewControllerが親になり、様々なDelegateを使うことができます。
textFieldShouldReturnの例をあげましたが、resignFirstResponderメソッドを持っているprotocolがわかれば、
自作で新しいクラスを作成し、protocolを準拠させて自分のやってほしい処理を移譲させることができます。