UIKit - 델리게이트 패턴이란?
UIKit - 델리게이트 패턴이란?
델리게이트 패턴이란?
UIKit에서 제공하는 거의 모든 UI에서 사용되기 때문에 핵심과도 같은 패턴임.
이 패턴은 이벤트를 자신이 직접 처리하는 것이 아닌 프로토콜을 통해 해당 프로토콜을 구현한 대리자에게 처리를 위임하는 패턴을 의미함.
델리게이트 패턴 구현 예시
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
import Foundation
// UITextFieldDelegate
@objc
protocol DriverbarDelegate{
func isTurnLeft() -> Bool
func isTurnRight() -> Bool
@objc optional func turnLeft()
@objc optional func turnRight()
}
// TextField
class Driverbar{
var delegate: DriverbarDelegate?
func turnLeft(){
// 예시 코드이기 때문에 강제 언래핑을 통해 처리
if (delegate?.isTurnLeft())!{
delegate?.turnLeft?()
}
}
func turnRight(){
// 예시 코드이기 때문에 강제 언래핑을 통해 처리
if (delegate?.isTurnRight())!{
delegate?.turnRight?()
}
}
}
// ViewController
class ExCar: DriverbarDelegate{
func isTurnLeft() -> Bool {
print("ExCar isTurnLeft 호출")
return true
}
func isTurnRight() -> Bool {
print("ExCar isTurnRight 호출")
return true
}
func turnLeft() {
print("ExCar turnLeft 호출")
}
func turnRight() {
print("ExCar turnRight 호출")
}
}
var exDriverbar: Driverbar = Driverbar()
var exCar: ExCar = ExCar()
exDriverbar.delegate = exCar
exDriverbar.turnLeft()
exDriverbar.turnRight()
위 예시 코드를 확인해보면, Driverbar(TextField 역할), DriverbarDelegate(UITextFieldDelegate 역할), ExCar(ViewController 역할)로 이루어져 있음.
하나씩 분석해보겠음.
1
2
3
4
5
6
7
8
9
// UITextFieldDelegate
@objc
protocol DriverbarDelegate{
func isTurnLeft() -> Bool
func isTurnRight() -> Bool
@objc optional func turnLeft()
@objc optional func turnRight()
}
DriverbarDelegate는 프로토콜로 선언되어 있으며, 사용되는 메서드들이 정의되어 있음.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// TextField
class Driverbar{
var delegate: DriverbarDelegate?
func turnLeft(){
if (delegate?.isTurnLeft())!{
delegate?.turnLeft?()
}
}
func turnRight(){
if (delegate?.isTurnRight())!{
delegate?.turnRight?()
}
}
}
Driverbar는 DriverbarDelegate 프로토콜 타입을 가진 delegate 변수를 옵셔널로 선언해둠.
그리고 특정 메서드를 실행하면 자신이 처리하는 것이 아닌 DriverbarDelegate에 선언되어 있는 메서드를 호출하여 처리함.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// ViewController
class ExCar: DriverbarDelegate{
func isTurnLeft() -> Bool {
print("ExCar isTurnLeft 호출")
return true
}
func isTurnRight() -> Bool {
print("ExCar isTurnRight 호출")
return true
}
func turnLeft() {
print("ExCar turnLeft 호출")
}
func turnRight() {
print("ExCar turnRight 호출")
}
}
ExCar는 DriverbarDelegate 프로토콜을 채택하여 프로토콜에 선언되어 있는 메서드를 구현함.
1
2
3
4
var exDriverbar: Driverbar = Driverbar()
var exCar: ExCar = ExCar()
exDriverbar.delegate = exCar
가장 핵심적인 부분으로 ExCar 인스턴스 변수를 Driverbar 클래스의 delegate 변수에 할당함.
1
2
exDriverbar.turnLeft()
exDriverbar.turnRight()
그 후 turnLeft, turnRight 메서드를 실행하면 ExCar 클래스에서 구현한 메서드들이 실행되는 것을 확인할 수 있음.
이처럼, 코드를 자신이 직접 처리하는 것이 아닌 delegate(대리자)에게 처리하는 것을 델리게이트 패턴이라고 함.
This post is licensed under CC BY 4.0 by the author.