- ChildCoordinator와 ParentCoordinator가 필요한 이유에 대해서 생각해보기
코디네이터 패턴을 도입하게 된 이유?
- viewController이 화면전환을 담당하기에는 객체 지향의 관점에서 올바르지 않다고 판단
- 조금더 가볍고 깨끗한 코드를 만들기 위해
코디네이터 패턴
protocol Coordinatable: AnyObject {
associatedtype AssociatedCoordinatorType: Coordinator
var coordinator: AssociatedCoordinatorType? { get }
}
AssociatedCoordinatorType
은 Coordinator
프로토콜을 준수하는 타입이어야 한다.
coordinator
속성은 옵셔널인 이유는 있을수도 있고 없을 수도 있으니깐!
- ViewController마다 해당 Coordinatable을 채택하고 있다.
- 해당 코드의 존재 이유는? 일관성 있게 각 뷰컨트롤러가 coordinator을 가질 수 있도록 한것이 아닐까?
Coordinator
import UIKit
public protocol Coordinator: AnyObject {
// MARK: - Properties
var parentCoordinator: Coordinator? { get set }
var childCoordinators: [Coordinator] { get set }
var navigationController: UINavigationController { get set }
// MARK: - Methods
func start()
func didFinish()
}
// MARK: - Default Implementation
public extension Coordinator {
func addChild(
_ child: Coordinator
) {
childCoordinators.append(child)
}
func removeChild(
_ child: Coordinator?
) {
for (idx, coordinator) in childCoordinators.enumerated() where coordinator === child {
childCoordinators.remove(at: idx)
break
}
}
}
- parentCoordinator: 내 부모의 코디네이터
- childCoordinator: 자식 코디네이터
- navigationController: 화면전환 담당
start(): 화면 전환 시작
didFinish(): 완료?