apple/DesignPattern, Architecture
Swift 디자인패턴 Delegation Pattern (딜리게이트 패턴)
lgvv
2022. 4. 10. 21:18
Swift 디자인패턴 Delegation Pattern (딜리게이트 패턴)
Delegation 패턴은 객체 간의 책임을 위임하여 특정 작업이나 이벤트 처리를 다른 객체에 맡기는 패턴.
Swift에서 흔히 사용되며, UIKit과 같은 Apple의 프레임워크에서 널리 활용
히스토리
- 2022-04-10: 디자인 패턴 스터디 정리
- 2024-11-29: 포스팅 글 재정리 및 조금 더 실용적인 예제 코드로 변경
Delegate Pattern
Delegate Pattern은 일반적으로 2가지 개념으로 구성됨
- Delegate: 작업을 수행하거나 이벤트를 처리하는 객체
- Delegating Object: 작업을 위임하는 객체.
특징
- 인터페이스에 의존하여 느슨한 결합
- 객체가 특정 작업에 직접 관여하지 않아 코드의 재사용성 증가
- 작업을 위임함으로써 객체의 책임 분리와 가독성 및 유지보수성 향상
사용하는 상황
- 두번째 뷰에서 첫번째 뷰로 이벤트를 전달하는 경우
- ViewModel이 하는 일이 많아서 Worker혹은 Interactor로 비즈니스 로직을 분리하고 싶은 경우
코드 예제
ViewModel이 해야하는 특정 처리 작업을 Worker로 분리하여 수행하는 예제
import UIKit
import SwiftUI
protocol TaskDelegate: AnyObject {
func didCompleteTask()
}
private protocol ViewModelCommand {
func send(action: ViewModel.Action)
}
private final class ViewModel: ViewModelCommand, TaskDelegate {
enum Action {
case buttonTapped
}
func send(action: Action) {
switch action {
case .buttonTapped:
let worker = Worker()
worker.delegate = self
worker.start()
}
}
func didCompleteTask() {
print("viewmodel: receive task working")
}
}
private class Worker {
weak var delegate: TaskDelegate?
func start() {
print("worker: start working")
delegate?.didCompleteTask()
}
}
private struct ContentView: View {
private let viewModel: ViewModelCommand = ViewModel()
var body: some View {
Button("Execute") {
viewModel.send(action: .buttonTapped)
}
}
}
#Preview {
ContentView()
}
(참고)
https://www.raywenderlich.com/books/design-patterns-by-tutorials/v3.0/chapters/4-delegation-pattern