[iOS] Delegate 구현해보기

승아·2021년 5월 3일
0

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()
  1. MyClass 인스턴스를 생성해주고 okButtonTapped()를 호출한다.
  2. okButtonTapped()에서 textField의 change()가 호출된다.
  3. TextField 클래스에서 받아온 delegate의 textcChange()가 호출된다.
  4. 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 관계

0개의 댓글