Delegateについて
Delegateについて
中々理解できなかったので、自分で分かりやすく覚えるためのメモ
猫と犬がいて、犬は猫が吠えたことを検知したい
検知したら犬側で何か処理をする
class Cat { var barkedWords = "" var delegate: CatDelegate? func stroke() { DispatchQueue.main.asyncAfter(deadline: .now() + 1) { self.bark() } } private func bark(){ barkedWords += "にゃん" delegate?.didBark() } }
猫は撫でると鳴き声が追加される
protocol CatDelegate { func didBark() }
準拠するためのルールを記述
「プロトコルとは、具体的な処理内容は書かず、クラスや構造体が実装するプロパティとメソッドを定義する機能」
class Dog: CatDelegate { func didBark() { print(cat.barkedWords) } let cat: Cat init() { cat = Cat() cat.delegate = self } func strokeCat() { cat.stroke() } }
犬は猫のデリゲートに準じて実装しなければならない
cat.delegate = self
準拠したプロトコルに自分自身を入れてあげる、これでcat.delegateが犬になる
delegate?.didBark()
犬になったdelegateがdidBarkメソッドを呼び出す
let dog = Dog() dog.strokeCat() dog.strokeCat()
同じように猿にも実装できる
class Monkey: CatDelegate { var count = 0 func didBark() { count += 1 print(cat.barkedWords + " : " + count.description) } let cat: Cat init() { cat = Cat() cat.delegate = self } func strokeCat() { cat.stroke() } }