理解に苦しんでいるdelegateとプロトコル(swift)の説明を自分なりに
解りやすく、振り返りようでまとめました。
間違いや誤った表現箇所等があればコメントで教えてくれると嬉しいです。
これも忘れないでね!ってことがあれば一緒にご教示ください。
Delegateの定義
Delegation is a design pattern that enables a class or structure to hand off(or delegate) some of its responsibilities to an instance of another type.
「デリゲートは、デザインパターンです。」
ここはマッハで無視します。
陥りやすいパターンとして、「Delegate」という英語をそのまま「デリゲート」理解しようとするとそもそもの概念の理解が難しくなることがあると思うので、英語の意味も調べます。
delegate toとは
権限などを〉〔…に〕委任[付与]する、〈人を〉(代表者[使節]として)〔…に〕特派[派遣]する
(複合動詞)
ふむふむ、権限などを付与する(継承)とのことですね。
つまりdelegateは「クラスを別のクラスへ継承できる、そして継承されたクラスの中で継承元のクラス内の情報を付与する動詞」
少し乱暴ですが、大まかな的は得てるかと思います。
具体的な使い方の説明
ここでプロトコルが現れます。
一応英語での意味も調べます。
protocolとは
(外交上の)儀礼、典礼、条約原案、議定書、プロトコル、(国家間の)協定、(実験・治療の)実施要綱
ふむふむ、つまり「決まりごと」または「お約束」ってな感じですね。
それでは具体的な説明に入ります。
登場人物は3人です。
- 処理を依頼する、のび太くんクラス
- 処理を担当する、ドラえもんクラス
- のび太くんがドラえもんへの依頼時に使用する携帯(プロトコル)
// プロトコルを作る。
// プロトコルを作る。
protocol 助っ人Delegate: AnyObject {
func 助けを呼ぶ(呼んでる人: のび太) //助っ人を呼ぶ宣言
}
// のび太クラス
class のび太 {
// ここで、プロトコルを継承するクラスのインスタンスを用意する。
weak var delegate: 助っ人Delegate?
func イジメられた() {
delegate?.助けを呼ぶ(呼んでる人: self)
}
}
// 助っ人Delegateプロトコルに準拠したドラえもんクラスを定義
class ドラえもん: 助っ人Delegate {
func 助けを呼ぶ(呼んでる人: のび太) {
print("\(のび太)待って!ドラえもんが来るよ!")
}
}
let メガネ = のび太()
let どら焼き = ドラえもん()
メガネ.delegate = どら焼き
メガネ.イジメられた() // "のび太待って!ドラえもんが来るよ!"
まとめ
自分として理解に苦しんだ理由としては、delegate = クラスの継承 = delegateっていう考え方をしていたことが第一の理由で、
第二の理由としては、クラスの概念を理解していなことが大きかったです。