デリゲートメソッドの見方

目的

仕事でデリゲートメソッドのソースの見方がわからなくなった。。。ので勉強
どこからメソッド呼んで、どこに行ってるのorz

デリゲートメソッドとは?

「あるクラスから他のクラスに処理を任せる」というデザインパターン

キーワード

キーワードは3つ。

プロトコル

デリゲートメソッド様の本体
実装の中身はない

依頼人クラス

デリゲートメソッドを実際に使うクラス
プロトコルを実装したクラス(代理人)のインスタンスを設定して、そこからメソッドを呼び出す

代理人クラス

プロトコルを継承
デリゲートメソッドの中身を記載

実際の処理

以下、playgroundで実装した処理。
(参考URL丸パクリです。。すみません)

// プロトコル
protocol Mochi {
func sayHello() -> String
func doPrint()
}
// 依頼人クラス(処理を任せるクラス
class Hoge {
// ここで、プロトコルに従うクラスのインスタンスを用意する。
var delegate: Mochi!
func say() -> String {
return delegate.sayHello()
}
func print() {
delegate.doPrint()
}
}
// 代理人クラス(処理を実行するクラス)
class Piyo: Mochi {
func sayHello() -> String {
return "Hello, Piyopiyo"
}
func doPrint() {
print("Hello World")
}
}
// 代理人クラス(処理を実行するクラス)
class Piyo2: Mochi {
func sayHello() -> String {
return "DIE, Piyopiyo"
}
func doPrint() {
print("End World")
}
}
let hoge = Hoge()
let piyo = Piyo()
let piyo2 = Piyo2()
hoge.delegate = piyo    // 重要。どの代理人にするのか
hoge.say()    // "Hello, Piyopiyo"
hoge.print()

まとめ

3つに分解して、どこがどれを担当しているのかを明確に洗い出すとソースがスッキリ見えてきた!!

・Aプロトコル
 プロトコルだから、、、デリゲートメソッド。こいつを継承してるのは、、、 
・Bクラス
 Bクラスが継承してるから、こいつが代理人クラス。こいつをインスタンス化して使ってるのは、、
・Cクラス
 Cクラスが依頼人クラスか!!

こうやって、1つ1つ紐解いて行くことでようやくどこからメソッドを呼んでどこに行き着くのかも明確に理解できた。

また、上のように代理人クラスだけ、別で作成することで
プロトコル依頼人クラスはそのまま再利用しつつ、別処理をさせることは便利だと感じた。

参考URL

とてもみやすく参考になりました。
ありがとうございます!

プロトコルとデリゲートのとても簡単なサンプルについて 
【swift】イラストで分かる!具体的なDelegateの使い方。
【Swift入門】難解なデリゲート(delegate)の使い方を理解しよう!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です