Delegate pattern


https://www.udemy.com/course/ios-13-app-development-bootcamp/learn/lecture/16253668#overview
udemiの講義を聞いているうちに、今日はDelegateを勉強して、内容を整理して復習します!
依頼を整理する前に、プロトコルを理解する必要があります.コースのコードに基づいてまとめます.

Protocol

performCPR을 할 수 있다.
protocol AdvancedLifeSupport {
    // CPR을 행할 수 있는 능력
    func performCPR()
}
この協議は資格を表す.
この証明書を使用している(=「:AdvancedLifeSupport」の後の)人、つまり、このプロトコルを使用しているクラスはfunc performancPR()を行うことができます.
プロトコルは、宣言された関数のカッコとコードの内容を直接宣言するのではなく、上記のプロトコルを使用するクラスまたは構造体によって直接割り当てられる必要があります.
したがって
struct Paramedic: AdvancedLifeSupport {
    
    //  응급상황 때마다 나에게 직접 연락을 해줄 콜센터 직원(=handler 인수) 배정
    init(handler: EmergencyCallHandler) {
        // 취득자 자신(=self)은 콜센터 직원(=handler 인수)으로부터 언제나 호출을 받는 상황이 된다.
        handler.delegate = self
    }
    func performCPR() {
        print("Paramedic Execute CPR.")
    }
    
}
上記AdvancedLifeSupportを採用したParamedic構造体は、プロトコルが所有するperformCPR()を実行できる必要があります.
performCPRを宣言しないとエラーが発生するので注意!

Delegate


Delegateを韓国語として解釈する場合は、代理または委任として解釈します.
//응급 상황이 생기면 AdvancedLifeSupport을 채택한 클래스에게 이 상황을 호출한다.
class EmergencyCallHandler {
    // 자기 자신을 delegate로 정의하는 클래스나 스트럭트 모두 이 delegate 변수를 프로퍼티로 가져야 한다.
    // CPR 자격증 취득자에 한해서만 delegate를 선언할 수 있다.
    var delegate: AdvancedLifeSupport?
    func medicalEmergency() {
        // CPR 가능한 사람은 이 알람을 듣고 CPR을 행해주세요
        delegate?.performCPR()
    }
}
委任変数は、AdvancedLifeSupportプロトコルタイプとして宣言されます.
let emilio = EmergencyCallHandler()
let pete = Paramedic(handler: emilio)

emilio.medicalEmergency()
//Paramedic Execute CPR.
これはemilioがMedicaleEmergencyを呼び出したときに依頼者peteがperformCPRを実行するコードです.
class Doctor: AdvancedLifeSupport {
    init(handler: EmergencyCallHandler) {
        handler.delegate = self
    }
   
    func performCPR() {
        print("A Doctor perfoms CPR.")
    }
    func useStethoscope() {
        print("Listen to heartbeat.")
    }
}
class Surgeon: Doctor {
    
    // 의사 중에서도 외과의사는 CPR을 하며 노래도 부를 수 있는 경지.
    override func performCPR() {
        super.performCPR()
        print("Surgeon even sing a song.")
    }
}
let ben = Surgeon(handler: emilio)

// 정리 : emilio가 신고접수를 받으면, CPR 자격증 보유자 모두에게 연락이 간다.
emilio.medicalEmergency()
/*
 Can you tell me what happend?
 Paramedic Execute CPR.
 A Doctor perfoms CPR.
 Surgeon even sing a song.
 Program ended with exit code: 0
 */
UITextFieldDelegateを見てみましょう.これは例ではありません.
class MainViewController : UITextFieldDelegate {
	@IBOutlet weak var searchTextField: UITextField!
    override func viewDidLoad() {
            super.viewDidLoad()
            searchTextField.delegate = self
    }
}
UItextFiledDelegateを使用するクラスが存在する場合、ViewDidLoad()メソッドでUItextFiledDelegateを担当するクラスは、MainViewControlによって制御されるように委任されます.
アップルの公式ドキュメントを見ると、UItextViewDelegateプロトコルのすべての方法がオプションなので、宣言する必要はありません.必要な方法を使用するだけでいいです.
    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        searchTextField.endEditing(true)
        print(searchTextField.text!)
        return true
    }
    //키보드에서 입력을 마친 후 Return을 눌렀을 때 발생하는 메서드
    //endEditing가 true이면 편집을 마치는 신호를 보내는 메서드이다.
    func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
        if textField.text != "" {
            return true
        } else {
            textField.placeholder = "Type Something"
            return false
        }
    }
    
    func textFieldDidEndEditing(_ textField: UITextField{
        if let city = searchTextField.text {
            weatherManager.fetchWeather(cityName: city)
        }
        searchTextField.text = ""
    }
    //Editing이 멈추게 되면 실행될 메서드이다.