[iOS] Delegate 구현해보기
Delegate 그거 어떻게 돌아가는건데 ? 그냥 쓰지말고 원리를 이해하며 써보자.
Delegate와 Notification을 비교하는 문제를 보고 이 둘을 왜 비교하지 ? 서로 다른 개념 아닌가 ? 라는 멍청한 의문이 들었다. 생각해보니 Delegate도 특정 이벤트가 발생하면 실행되는것이고 Notication도 특정 이벤트가 발생하면 NoticationCenter에 등록해 관찰차가 캐치하고 실행시키니 목적은 같은 거였음 .. 😅
Delegate를 직접 구현해서 원리를 이해해보자! TextField의 Delegate가 실행되는 과정을 가정해보았다.
1. protocol을 구현해보자.
protocol TextFieldDelegate {
func textChange(text: String)
}
2. TextFeild 클래스를 만들어주자.
class TextField{
var delegate: TextFieldDelegate?
func chage(){
print("---> 2. OK textChange 실행 시켜")
delegate?.textChange(text: "🐼")
}
}
3. 실행시킬 클래스를 만들고 실행시켜 보자.
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()
- MyClass 인스턴스를 생성해주고 okButtonTapped()를 호출한다.
- okButtonTapped()에서 textField의 change()가 호출된다.
- TextField 클래스에서 받아온 delegate의 textcChange()가 호출된다.
- myClass의 textChange가 호출되어 값을 바꾼다.
// 출력
---> 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를 활용하여 전달하는것이 좋다고 한다.
+ Delegate와 Notification의 차이 ( 참고 사이트 )
- Delegate
- 제3의 객체가 필요없음
- 다수 객체들에게 이벤트발생 전달 어렵고 비효율적
- 엄격한 Syntax, 메소드 명확하게 명시
- 위임되는 객체와 위임하는 객체가 1:1 관계 - Notifcation
- Notification Center 싱글턴 객체를 통해서 이뤄짐
- 다수 객체에게 동시에 이벤트 발생 전달 가능
- 컴파일시 추적이 어려움
- 알림을 보내는 객체와 등록된 객체들간 1:N 관계
Author And Source
이 문제에 관하여([iOS] Delegate 구현해보기), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@sainkr/iOS-Delegate-직접-구현해보기저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)