Coordinator Pattern

khanlou 가 고안한 패턴으로 비대해지는 ViewController에서 화면전확 로직을 분리해낸 객체를 coordinator라고 한다. Coordinator는 하나 이상의 ViewController를 제어하며 화면전환을 지시한다.

고안 이유

  1. 특정 ViewController에 화면전환 로직이 포함되면 해당 ViewController에 전환될 화면의 ViewController에 대한 의존관계가 형성됨.
  2. ViewController가 비대함.
  3. 특정 ViewController에서 여러가지 화면으로의 화면전환이 필요하다면 화면전환 로직과 View에 대한 로직이 뒤섞이므로 응집도가 떨어짐.

이러한 문제점들을 해결하기 위해 Khanlou는 Coordinator라는 객체를 ViewController의 상위 객체로 두어 화면전환 로직을 응집도 있게 관리하는 방법을 고안한 것이다.

Implementation

import UIKit

protocol Coordinator: AnyObject {
		var navigationController: UINavigationController? { get set }
		var parent: Coordinator? { get set }
		var children: [Coordinator] { get set }
		
		func start()
}

extension Coordinator {
		func removeFinishedChild(_ child: Coordinator) {
				for (index, coordinator) in children.enumerated() {
            if coordinator === child {
                children.remove(at: index)
                break
            }
        }
		}
}