일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- property
- initalizer
- extension
- delegate
- IOS
- struct
- 스위프트
- 이니셜라이저
- init
- Git
- enum
- Foundation
- 디자인패턴
- Method
- String
- instance
- UIKit
- Swift
- url
- Terminal
- tuist
- optional
- interpace
- Protocol
- Unicode
- Xcode
- Class
- initializer
- 코딩테스트
- type
Archives
- Today
- Total
아리의 iOS 탐구생활
[iOS] Delegation 패턴에 대해서 알아보자. 본문
반응형
Delegation을 한줄로 요약하자면 아래와 같다.
어떤 상황이 발생했을 때 어떤 객체에게 응답을 준다. 약간 리모콘을 발동시킨다는 느낌...?
Delegate는 보통 Protocol을 정의하여 사용된다. Protocol이란 일종의 기능 명세서 같은 것으로 Delegate로 지정된 객체가 해야하는 메소드들의 원형을 적어놓는다. Delegate 역할을 하려는 객체는 이 Protocol을 따르며 원형만 있던 메소드들의 구현을 한다. 이렇게 세팅 후 이전 객체는 어떤 이벤트가 일어났을 시 Delegate로 지정한 객체에 알려줄 수 있다.
# 장점
- 매우 엄격한 Syntax로 인해 프로토콜에 필요한 메서드들이 명확하게 명시된다.
- 컴파일 시 경고나 에러가 떠서 프로토콜의 구현되지 않은 메소드들을 알려준다
- 로직의 흐름을 따라가기 쉽다
- 프로토콜 메소드로 알려주는 것 뿐만 아니라 정보를 받을 수 있다.
- 커뮤니케이션 과정을 유지하고 모니터링하는 제 3의 객체가 필요없다. (NotificationCenter같은 외부 객체)
- 프로토콜이 컨트롤러의 범위 안에서 정의된다.
# 단점
- 많은 줄의 코드가 필요하다
- delegate 설정에 nil이 들어가지 않게 주의해야한다. 크래시를 일으킬 수 있다.
- 많은 객체들에게 이벤트를 알려주는 것이 어렵고 비효율적이다. (가능은 하다.)
# 선언부 (처리하라고 시키는 객체, 주로 이벤트를 받는 뷰들)
- 리모콘호출 응답을 받아서 일을 처리할 클래스에 프로토콜 타입 프로퍼티를 옵셔널로 선언한다.
- 리모콘작동 어느 시점에서 실행할지 정했던 부분에 프로토콜의 메서드를 호출해주면 된다.
# 구현부 (대신 처리해줄 객체 , ViewController)
- 프로토콜을 생성한다.
- 리모콘설계 첫번째 뷰에 delegate를 채택하고 프로토콜을 준수한다 (메서드 구현 등…)
- 리모콘전달 프로토콜을 채택하고 준수한 첫번째 뷰에서 리모콘을 실행할 다음 뷰로 넘어갈때 자신을 넘겨준다
(예시: nextView.delegate = self)
# 언제 사용할까?
- 하나의 객체가 해야하는일이 여러가지일 때
- 수신받는 객체가 많을 때, 콜백 블럭을 받기 위한 목적이 분명할 때
- 내부의 블록을 호출시키는 코드를 읽고 다시 돌아와서 추적할 일이 없는 경우
간단한 예제코드를 통해 Delegation 패턴을 이해해보자.
protocol BossDelegate {
func wakeUp() // 깨우는 일을 위임
}
class Boss: BossDelegate {
private var isSleeping: Bool = true
func wakeUp() { // 비서가 해줄일
isSleeping = false
print("보스: 아...잘잤다~~~~")
}
}
class Secretary {
var boss: BossDelegate? // 보스를 위임받음
func wakeUpBoss() { // 비서가 하는일
print("비서: 사장님... 일어나셔야죠...!!!")
boss?.wakeUp() // 보스의 일을 대신해줌, Delegation 패턴 적용
}
}
let secretary = Secretary()
let ari = Boss()
secretary.boss = ari // 보스를 설정후
secretary.wakeUpBoss() // 보스를 깨운다.
/*
비서: 사장님... 일어나셔야죠...!!!
보스: 아...잘잤다~~~~
*/
반응형
'Swift > iOS' 카테고리의 다른 글
[UIKit/iOS] 뷰의 재사용이란? (0) | 2022.02.06 |
---|---|
[iOS/UIKit] Frame vs Bounds (0) | 2021.12.02 |
[iOS/UIKit] init(frame:)와 init(coder:) (0) | 2021.12.01 |
[iOS/Swift] TDD와 Unit Test (0) | 2021.11.23 |
[iOS/UIKit] prepare method 알아보기 (0) | 2021.10.28 |
Comments