사전적 의미 Delegate : 대리인
객체와 객체간의 커뮤니케이션을 돕는다.
프로토콜 타입을 사용하여 요구사항을 구현하여 전달
왜 프로토콜을 사용하는가? 애플이 개발자가 어떤이름을 사용할지 모르기때문이다. 프로토콜 자체가 타입으로 인식해서 어떤 이름을 사용해도 상관이없어져있기때문
<aside> 💡 각종 이벤트를 효율적으로 관리하기 위해 대리자를 지정하여 이벤트 처리를 위임하고,
이벤트 발생시 위임된 대리자가 콜백 메소드를 호출하는 설계 패턴
예시로 살펴보자
리모콘을 만든 후 리모콘 델리게이트로 tv를 사용해보기
RemoteControlDelegate이라는 프로토콜에 채널을 올리고, 내릴수 있도록 위임(대리)해준다.
protocol RemoteControlDelegate {
func channelUp()
func channelDown()
}
TV의 채널을 올리고 내리는 요구사항을 작성해준다.(실제 동작을 함)
class RemoteControl {
var delegate: RemoteControlDelegate? //프로토콜타입으로 정의
func doSomething() {
print("리모콘의 조작이 일어나고 있음")
}
func channelUp() { // 어떤 기기가 리모콘에 의해 작동되는지 몰라도 됨
delegate?.channelUp() //대리자의 channelUp이라는 메소드호출
}
func channelDown() { // 어떤 기기가 리모콘에 의해 작동되는지 몰라도 됨
delegate?.channelDown()
}
}
RemoteControlDelegate 프로토콜을 채택하여 리모콘이라는 객체를 만들어준다.
채택한 곳에서 Delegate를 통해서(대리자의) channelUp,channelDown이 동작된다.
// TV 클래스(뷰컨트롤러의 역할 - 리모콘과 커뮤니케이션)
class TV: RemoteControlDelegate {
//필수적인 요구사항을 구현해야함
func channelUp() {
print("TV의 채널이 올라간다.")
}
func channelDown() {
print("TV의 채널이 내려간다.")
}
}
let remote = RemoteControl()
let samsungTV = TV()
remote.delegate = samsungTV //대리자가 samsungTV
객체내에서 사용시 self로 사용할수 있음