개발일기/IOS

[Swift] - Xcoordinator 정리해보자

코딩하는빵친자 2024. 3. 15. 09:56

Presentable

public protocol Presentable

  • var viewController : UIViewController! { get }
    • 뷰 컨트롤러 객체
  • func router<R: Route>(for route: R) → StrongRouter<R>?
    • Route타입 인자(어디화면으로 갈건지 정보)를 받아서 StrongRouter<인자>를 return
  • func presented(from presentable: Presentable?)
    • Presentable객체를 인자로 받음, 띄워주는 것 같다.
  • func registerParent(_ presentable: Presentable & AnyObject)
    • Prsentable프로토콜을 따르는 객체이면서 동시에 클래스 타입인 객체를 인자로 받는다
    • 부모를 등록하는 것 같다
  • func childTransitionCompleted()
    • 자식으로의 전환을 완료되었다는 것 같음
  • func setRoot(for window: UIWindow)
    • UIWindow객체를 인자로 받아서 루트뷰를 등록하는 것 같음
  • extension Presentable
    • setRoot메서드 → { window.rootViewController = viewController, window.makeKeyAndVisible(), presented(from:window) }
      • 인자로 받은 윈도우 객체의 루트 뷰 컨트롤러를 등록하고, 키 윈도우로 만들고 화면에 표시하고, presented메서드 실행?
    • router메서드 → { self as? StrongRouter<R> }
      • Presentable프로토콜을 채택하고 있는 자기 자신을 StrongRouter<자기자신>해서 return

Router

public protocol Router: Presentable

  • associateType RouteType: Route
    • Route프로토콜을 채택하는 제네릭 타입
  • func contextTrigger(_ route: RouteType, with options: TransitionOptions, completion: ContextPresentationHandler?)
    • public typealias ContextPresentationHandler = (TransitionContext) -> Void
    • Route프로토콜을 채택하는 제네릭타입과 트랜지션옵션, 컴플레션핸들러를 인자로 받는다
  • extension Router
    • public func trigger(_ route: RouteType, with options: TransitionOptions){}
      • Route프로토콜을 채택하는 제네릭타입과 트랜지션옵션을 인자로 받아서 세번 째 trigger함수로 completion은 nil로 해서 넘김
    • trigger(route, with:options, completion:nil)
    • public func trigger(_ route: RouteType, completion: PresentationHandler? = nil){}
      • PresentationHandler = () → Void
      • RouteType타입과 컴플레션을 받아서 with는 .default로 해서 넘김
    • trigger(route, with : .default, completion: completion)
    • public func triggeer(_ route: RouteType, with options: TransitionOptions, completion: PresentationHandler?){contextTrigger(route, with: options) { _ in completion?() }
      • 인자로 받은 것들을 contextTrigger함수에 넘김.
    • } }
    • autoreleaspool{
    • public var strongRouter: StroungRouter<RouteType>{ StrongRouter(self) }
    • public func router<R: Route>(for route:R) → StrongRouter<R>?
    • { strongRouter as? StrongRouter<R> }

StrongRouter

public final class StrongRouter<RouteType: Route> : Router

private let _contextTrigger: (RouteType, TransitionOptions, ContextPresentationHandler?) -> Void

private let _trigger: (RouteType, TransitionOptions, PresentationHandler?) -> Void

private let _presented: (Presentable?) -> Void

private let _viewController: () -> UIViewController?

private let _setRoot: (UIWindow) -> Void

private let _registerParent: (Presentable & AnyObject) -> Void

private let _childTransitionCompleted: () -> Void

—> 모두 Presentalble에 있는 것들을 init할 때 대입하고, 언더바 없는 이름으로 함수 만들어서 위에 프로퍼티들을 실행한다.


NavigationCoordinator<Routetype: Route> : BaseCoordinator<RouteType,NavigationTransition>

public let animationDelegate = NavigationAnimationDelegate()
// 네비게이션 애니메이션 대리자 선언

public var delegate: UINavigationControllerDelegate? {
    get {
        animationDelegate.delegate
    }
    set {
        animationDelegate.delegate = newValue
    }
}

public override init(rootViewController: RootViewController = .init(), initialRoute: RouteType? = nil) {
    if rootViewController.delegate == nil {
        rootViewController.delegate = animationDelegate
    }
    super.init(rootViewController: rootViewController, initialRoute: initialRoute)
    animationDelegate.presentable = self
}

public init(rootViewController: RootViewController = .init(), root: Presentable) {
    if rootViewController.delegate == nil {
        rootViewController.delegate = animationDelegate
    }
    super.init(rootViewController: rootViewController, initialTransition: .push(root))
    animationDelegate.presentable = self
}
728x90