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

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

 

Design Patterns by Tutorials, Chapter 4: Delegation Pattern

The delegation pattern enables an object to use another “helper” object to provide data or perform a task rather than the task itself. By relying on a delegate protocol instead of a concrete object, the implementation is much more flexible: any object

www.raywenderlich.com