2022-09-08
デリゲートとは、開発し続けて肥大化するクラスが増えて後々メンテナンスが難しくなった時に
新しく処理を追加する際の探すコスト・またはある処理を直すコストを削減するために
処理をかき分ける手段のことをさします。
protocol:デフォルトのメソッドが置いてあるクラスのこと。デリゲートされたクラスの
メソッドの内容によって処理が変わる。
protocol MyDelegate {
func sayHello()
func sayName()
func sayAge()
}
extension MyDelegate {
func sayAge() {
print("My age is 31")
}
}
Person:処理を任せるためのクラス。デリゲートを任せられたクラスはここで使われる。
import Foundation
final class Person {
var delegate: MyDelegate? // 処理を任せる相手を保持する
func gree() {
guard let delegate = delegate else {
print("デリゲートが未選択です")
return
}
if type(of: delegate) == Asaba.self {
delegate.sayHello()
delegate.sayName()
} else if type(of: delegate) == Jack.self {
delegate.sayHello()
delegate.sayName()
delegate.sayAge()
}
}
}
任せられたクラスによってメソッドの動きが変わっていく。
Asaba:処理を任せられるクラスのこと。どんな処理を任せたいかを決め、protocolクラスの
デフォルトメソッドに新たなメソッドを追加する。
import Foundation
final class Asaba: greetingDelegate {
func sayHello() {
print("こんにちは!")
}
func sayName() {
print("初めまして、asabaです!")
}
}
viewContorrlerでは処理を任せるクラスのインスタンスを追加し、 Personクラスに任せたいAsabaクラス
を持たせる。任せたクラスのメソッドをPersonクラスで呼び出してAsabaクラスのメソッドとして
実行する。(Protocolクラスのメソッド名と名前が合っていないといけない。)
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let person = Person()
let asaba = Asaba()
person.delegate = asaba
person.gree()
}
}
この組み合わせなら、どんなクラスが来ても同じような処理を書かずに一つのデリゲートクラスだけで
賄うことができます。(ただしメソッドの用途は似通っていなければならない)
ソースコードが多くなることが見込まれるアプリを作る際は使えるようにしておいたほうが
良いですね。