본문 바로가기

Codes Travel/iOS Boost Course #2019

Delegation?

안녕하세요 :)

iOS 개발자 리치(rich_iosdev)입니다.


공유해드릴 내용은 Delegation입니다.

 

Delegation Design Pattern

  • 클래스나 구조체에서 하는 일부분의 수행 작업을 다른 객체에게 대신하도록 하는 디자인 패턴
  • View가 받은 이벤트 상태를 ViewController에게 전달해주기 위해 사용
  • ViewController를 통해 View 구성에 필요한 데이터를 받는 용도로 사용

 

Delegate Pattern 샘플 코드

선언부
class CustomView: UIView {

// 2. 클래스에 delegate 프로퍼티 생성 
var delegate:CustomViewDelegate?

override func layoutSubviews() {
// 3. delegate 인스턴스의 메소드 실행
delegate?.viewFrameChanged(newFrame: self .frame) }
}

// 1. 프로토콜 생성
protocol CustomViewDelegate {
func viewFrameChanged(newFrame:CGRect) }
구현부
// 1. CustomView Delegate 채택
class ViewController: UIViewController, CustomViewDelegate{
   
   override func viewDidLoad() { 
        super . viewDidLoad ()

   // 3. custom instance의 delegate 프로퍼티에 자기자신의 인스턴스를 할당
   (프로토콜 추상화 타입)
   let custom = CustomView() 
   custom.delegate = self
}

// 2. 채택한 Delegate 메소드 구현
func viewFrameChanged(newFrame: CGRect){
// 뷰의 프레임이 변경될때마다 불림
   }
}

Custom한 Delegate를 직접 만들어서 구현을 해봤습니다.

 

위 샘플 코드처럼 Delegate Pattern은 선언부와 구현부로 나뉩니다.

 

[선언부]

 

1. 프로토콜 (Delegate)을 생성

2. 처리하라고 시키는 객체 프로토콜 (Delegate) 프로퍼티 생성

3. 프로토콜 (Delegate) 인스턴스의 메서드를 실행

 

[구현부]

 

1. ViewController에서 프로토콜(Delegate) 채택

2. 채택한 프로토콜(Delegate) 메서드를 구현

3. delegate 인스턴스에 대신 처리해줄 객체 (self: ViewController)를 할당 즉 대리자를 지정.

 

위와 같이 정리해봤습니다.

 

UITextFieldDelegate, UITableViewDataSource 그리고 UICollectionViewDataSource 프로토콜을 채택해서 많이 활용을 하고 있는 디자인 패턴입니다.

 

  • 처리하라고 시키는 객체 (주로 이벤트를 받는 뷰들)
  • 대신 처리해줄 객체 (ViewController)

라는 마기님의 블로그 내용이 가장 이해하기 쉬웠던 것 같아서 참고하였습니다.

 

잘못된 내용이 있다면 댓글로 남겨주세요!

확인해서 수정하도록 하겠습니다

 

끝까지 읽어주셔서 정말 감사합니다

 

References

 

rich_iosdev의 github

Delegate Pattern

https://github.com/richoh86/OhWonSeok_iOS_School6/blob/master/Class/DelegatePattern.md

 

마기님의 블로그

iOS Delegate 패턴에 대해서 알아보기

https://magi82.github.io/ios-delegate/

 

[부스트코스] iOS 프로그래밍

Delegation?

https://www.edwith.org/boostcourse-ios/lecture/16856/