Delegate 그거 어떻게 돌아가는건데 ? 그냥 쓰지말고 원리를 이해하며 써보자.
Delegate와 Notification을 비교하는 문제를 보고 이 둘을 왜 비교하지 ? 서로 다른 개념 아닌가 ? 라는 멍청한 의문이 들었다. 생각해보니 Delegate도 특정 이벤트가 발생하면 실행되는것이고 Notication도 특정 이벤트가 발생하면 NoticationCenter에 등록해 관찰차가 캐치하고 실행시키니 목적은 같은 거였음 .. 😅
Delegate를 직접 구현해서 원리를 이해해보자! TextField의 Delegate가 실행되는 과정을 가정해보았다.
protocol TextFieldDelegate {
func textChange(text: String)
}
class TextField{
var delegate: TextFieldDelegate?
func chage(){
print("---> 2. OK textChange 실행 시켜")
delegate?.textChange(text: "🐼")
}
}
class MyClass: TextFieldDelegate{
var myName: String = "😈"{
didSet(oldValue){
print("---> 변경 전 : \(oldValue), 변경 후 : \(self.myName)")
}
}
let textField = TextField()
init() {
textField.delegate = self // textFiled에 이 class에 있는 delegate값을 넘겨준다.
}
func okButtonTapped(){
print("---> 1. 버튼 눌렀다.")
textField.chage()
}
func textChange(text: String){
print("---> 3. 내가 원하는건 myName 값을 바꾸는거임")
myName = text
}
}
let myClass = MyClass()
myClass.okButtonTapped()
// 출력
---> 1. 버튼 눌렀다.
---> 2. OK textChange 실행 시켜
---> 3. 내가 원하는건 myName 값을 바꾸는거임
---> 변경 전 : 😈, 변경 후 : 🐼
delegate를 넘겨주는게 중요 포인트다!
textField.delegate = self
import Foundation
protocol TextFieldDelegate {
func textChange(text: String)
}
class MyClass: TextFieldDelegate{
var myName: String = "😈"{
didSet(oldValue){
print("---> 변경 전 : \(oldValue), 변경 후 : \(self.myName)")
}
}
let textField = TextField()
init() {
textField.delegate = self
}
func okButtonTapped(){
print("---> 1. 버튼 눌렀다.")
textField.chage()
}
func textChange(text: String){
print("---> 3. 내가 원하는건 myName 값을 바꾸는거임")
myName = text
}
}
class TextField{
var delegate: TextFieldDelegate?
func chage(){
print("---> 2. OK textChange 실행 시켜")
delegate?.textChange(text: "🐼")
}
}
let myClass = MyClass()
myClass.okButtonTapped()
안드로이드 몇 개월 안했다고 까먹긴했는데 Listener랑 비슷한 개념인것 같다. 하지만 interface랑 protocol은 다르다.
추가적으로 Delegate를 이용한 ViewController간 Data전달방법 보는 걸 추천한다. Data를 직접적으로 전달하면 ViewController 간의 상관관계가 깊어지기 때문에 Deleagate를 활용하여 전달하는것이 좋다고 한다.