본문 바로가기

Swift

Swift - Delegate Design Pattern의 초보적 이해

Delegate : 한 객체가 할 일을 대신 위임 받은 객체를 말합니다. 이 때 위임을 받을 수 있는 객체는 위임을 넘겨줄 객체가 정의한 프로토콜을 준수하는 객체에만 한정 됩니다.

 

Protocol : 일종의 자격증이라 생각하면 됩니다. 이 자격증(Protocol)을 준수하며 자격증에서 요구하는 기준에 따라 자신(대리자)의 필요에 맞는 기능을 구현하면 됩니다. 위임할 객체는 위임 받을 객체가 자신이 규정한 자격증(Protocol)을 가졌을 때만 위임자(대리자)로 지정 할 수 있다는 것을 다시 기억해주세요.

 

 

데이터 클래스에서 필요한 것

1. 델리게이트 프로토콜 선언 및 필요한 메서드 선언

2. 데이터 클래스 안에 델리게이트 변수, 데이터 변수, 델리게이트에게 데이터를 이용한 프로토콜 메서드 사용하도록 하는 코드의 3가지 부분 필요

// 데이터 클래스 문서

// 데이터 클래스의 프로토콜 선언(이 데이터 클래스를 사용할 수 있게해주는 자격증!)
protocol DataClassDelegate {
    func technicOne(number: Int){}	// number 데이터를 사용하기 위해서는 꼭 technicOne이라는 이름을 가진 메서드를 구현해야함
									//메소드의 인자는 이 프로토콜을 채택한 Delegate에게 처리를 위임할 데이터를 넣어줌
}

// 데이터 클래스
class DataClass {

	var delegate: DataClassDelegate?	// 데이터 클래스를 사용할 클래스명(DataclassDelegate 프로토콜을 선언한 클래스의 이름)

	let foo: Int	// 정수 데이터

	delegate?.technicOne(foo) // 정수 데이터를 담아서 사용 신청을 한 클래스에 전달& 해당 클래스에서 구현한 technicOne 메소드에 맞게 데이터를 사용하도록 함
}

위와 같이 델리게이트 프로토콜을 구현해 놓으면 아래에서 예시를 든 클래스 외에도 어느 클래스든 델리게이트 프로토콜을 확장함으로 쉽게 데이터를 가져다 쓸 수 있습니다. 따라서 매번 번거롭게 데이터 클래스의 구현 부분을 사용할 클래스 하나하나를 위해 변경하지 않아도 됩니다.

 

 

데이터 클래스를 사용할 클래스에서 필요한 것

1.데이터 클래스의 인스턴스 생성 및 델리게이트 self로 지정

2. 델리게이트 프로토콜의 메서드 구현 

// 데이터 클래스를 사용할 유저 클래스

class userClass: dataClassDelegate {

	let dataClass = DataClass()	// 데이터 클래스의 인스턴스 생성
    dataClass.delegate = self	// 데이터 클래스의 대리인을 유저클래스로 설정

	func technicOne(number: Int){	// 프로토콜에서 요구하는 메서드 구현
    	print(number)
    }
}