본문 바로가기
FRONT-END/iOS

Swift 델리게이트 패턴 이해하기

by 랄라J 2023. 8. 7.

델리게이트는 객체와 객체 간의 의사소통을 위한 것이다. 예를 들면 텍스트필드와 뷰컨트롤러 간의  의사소통을 하기위해 만드는 것이 바로 델리게이트다. 그리고 의사소통을 하기 위해서 프로토콜을 따라야한다. 해당 프로토콜을 통해 정의된 것들을 구현하면서 텍스트필드에서 일어나는 것들을 뷰 컨트롤러에 전달할 수 있게 된다. 

 

예를들어 리모컨 컨트롤러를 만들고, 이를 다른 기기 컨트롤러와 연결하고자 할 때 필요한 과정을 요약해보자면

1. 리모컨 컨트롤러 사용을 위한 프로토콜을 만든다.

protocol RemoteControlDelegate {
    func powerOn()
    func powerOff()
}

 

2. 해당 프로토콜을 델리게이트로 이용하는 RemoteControl 클래스를 만든다.

해당 클래스에서는 delegate라는 변수를 만들고 타입은 위 자격증으로 만든 프로토콜으로 설정한다.

프로토콜에서 설정했던 메서드 명과 동일하게 내부 메서드를 만들고, 실행은 delegate로 받은 내부 함수를 실행하도록 작성한다.

Class RemoteControl {
    var delegate: RemoteControlDelegate?
    
    func powerOn() {
        delegate.powerOn()
    }

    func powerOff() {
        delegate.powerOff()
    }
}

 

3. 연결하고자 하는 다른 기기의 컨트롤러에서 RemoteControlDelegate 프로토콜을 설정한다. 그리고 프로토콜의 규칙에 맞게 구현해야하는 메서드들을 구현한다.

Class Computer: RemoteControlDelegate {
    func powerOn () {
        print("컴퓨터 전원 on")
    }

    func powerOff () {
        print("컴퓨터 전원 off")
    }
}

 

4. RemoteControl과 Computer의 인스턴스를 각각 생성한 후 RemoteControl의 인스턴스의 delegate를 Computer의 인스턴스로 할당한다.

let computerRemote = RemoteControl()
let computer = Computer()

computerRemote.delegate = computer

computer.powerOn()
computer.powerOff()

 

3, 4. 다른 설정으로는 기기에 생성자로 아래와 같이 설정해 delegate를 등록할 수 있도록 한다.

Class Phone: RemoteControlDelegate {
    init(remote: RemoteControl) {
    	remote.delegate = self
    }

    func powerOn () {
        print("컴퓨터 전원 on")
    }

    func powerOff () {
        print("컴퓨터 전원 off")
    }
}

let phone = Phone(remote: remote)
// phone.powerOn()
// phone.powerOff()

 

728x90

'FRONT-END > iOS' 카테고리의 다른 글

Xcode MARK, 코드 스니펫 설정하는 법  (0) 2023.08.10
Swift 에러 처리(Error Handling)  (0) 2023.08.07
Swift 메모리 관리(ARC)  (0) 2023.08.06
Swift 고차함수 (map, filter, reduce)  (0) 2023.08.04
Swift 클로저(Closure)  (0) 2023.08.04

댓글