こんにちは。
社会人1年目のエンジニアです。
今回はdelegateに関して備忘録としてまとめておこうと思います。
そもそもdelegateとは
デザインパターンの1つ。
あるクラスから、他のクラスに処理を「任せる」こと。
任せる処理内容の例:ボタンをタップした際の処理、何かイベントを検知した際の処理
delegateの実装手順
- protocolを宣言
- 処理を任せる側の実装
- 処理を任せられる側の実装
- delegateを呼び出す
protocolの宣言
プロトコルとは、クラスや構造体が保持するプロパティやメソッドなどの決まり事を定めるものです。
今回では、任せる処理をメソッド(デリゲートメソッド)として定義します。
protocol PrintDelegate {
func displayLetter()
}
処理を任せる側の処理
デリゲートメソッドを使用し、処理の流れを記述します。
class DisplayLetter {
var delegate: PrintDelegate? = nil
func clickButton() {
print("clickButtonに入りました")
if let printDelegate = self.delegate {
printDelegate.displayLetter()
}
}
}
変数delegateでは、プロトコルを実装したクラスのインスタンスを設定します
メソッドclickButtonでは、変数delegateのnilチェックを行い、
nilでなければ、プロトコル内で定義したdisplayLetterメソッドを実行します。
処理を任せられる側の実装
デリゲートメソッドを実装します。
extension ViewController: PrintDelegate {
func displayLetter() {
print("Delegateを行いました。")
}
}
今回では、protocol内でdisplayLetterメソッドを定義しているので、
その中身を実装していきます。
protocol内で定義したメソッドが複数ある場合、全て実装しないとエラーになります。
delegateを呼び出す
@IBAction func buttonTapped(_ sender: Any) {
print("ボタンを押しました")
let displayLetter = DisplayLetter()
displayLetter.delegate = self
displayLetter.clickButton()
}
変数displayLetterでは、先ほど実装したDisplayLetterクラスのインスタンス化を行い、
使用できるようにします。
そして、delegate先を自身(ViewController)にします。
最後に、クラス内のclickButtonを呼び出します。
実行結果
手順は以上になります。
実行してみると下記のように出力されます。
まず初めに呼び出す前の「ボタンを押しました」が呼ばれます。
その後、クラス内の「clickButtonに入りました」が呼ばれます。
最後に、デリゲートメソッドを実装した際の「Delegateを行いました。」が呼ばれます。
動画で撮ると下記になります。
順に呼ばれていることがわかると思います。
以上がdelegateに関する説明でした。
自分自身も全て理解しているわけではないので、
理解が深まり次第記事を更新していきたいと思います。