since 2026

천천히 보고, 오래 남기는 곳

할머니가 되어서도 코딩 공부를 계속해 나가겠다는 각오로 공부와 실수를 기록합니다.

최근의 글

latest

[TCA] ifLet

TCA에서 ifLet은 부모 Reducer가 Optional(?) 상태로 존재하는 자식 Reducer의 로직을 안전하게 연결하고 수명주기를 제어하는 연산자(Operator)이다.

 

ifLet의 정의와 역할

정의

부모의 State 내부에 자식 State가 Optional 타입 (예: ChildFeature.State?)으로 존재할 때, 이 값이 nil이 아닐 때만 자식 Reducer를 동작하도록 바인딩해 주는 메서드이다.

역할

  • 조건부 로직 실행 : 자식 State가 존재할 때만 자식에서 들어오는 Action을 자식 Reducer로 전달한다.
  • 자동 메모리 & Effect 정리 : 자식 State가 nil로 바뀌어 화면이 닫히는 순간, 자식 Reducer에서 실행 중이던 모든 비동기 작업(Effect)을 자동으로 취소하고 메모리를 해제한다.
  • 상태 동기화 : 자식 화면에서 일어난 상태 변경을 부모 State 내 해당 자식 프로퍼티에 즉시 반영한다.

 

ifLet 연계 개념

Tree-based Navigation (계층형 화면 전환)

TCA에서 화면을 띄우는 방식은 크게 두 가지(Tree 방식, Stack 방식)이다. ifLet은 이 중  Tree 방식(부모-자식 관계가 1:1로 꼬리를 무는 구조)의 핵심 축이다.

 

Alert, Sheet, Popver, Confirmationdialog 처럼 특정 조건에서만 떠야 하는 1:1 화면 전환 처리에 주로 사용된다.

 

@Presents & PresentationAction

ifLet은 항상 이 두 개념과 세트로 동작한다.

@Presents

자식 State가 화면에 떠 있는지(Optional)를 감시하는 매크로

@PresentationAction

자식이 열림, 닫힘, 또는 자식 내부에서 이벤트가 터졌음을 알려주는 라벨.

ifLet(\.$child, action \.child)

@Presents가 붙은 프로퍼티 투영($)과 PresentationAction을 서로 고리처럼 엮어주는 역할을 수행

 

Scope (영역 잘라내기)

  • Reducer에서의 ifLet :
  • 부모 Reducer와 자식 Reducer의 로직을 연결
  • View에서의 scope :
  • 부모 Store에서 자식 전용 Store를 잘라내어 View에 전달
  • 두 연산자는 항상 짝을 이루어, Reducer에서 ifLet으로 묶은 자식 도메인은 View에서 .sheet(item:$store.scope(…)) 형태로 받아서 화면에 띄운다.

 

var body: some Reducer<State, Action> {
  //1. 부모 자신의 로직
  Reduce {state, action in

    switch action {
    case .openButtonTapped:
        state.child = ChildFeature.State()
        return .none
    case .child:
        return .none
    }

  //2. ifLet으로 자식 Reducer 연동
  //state.child가 nil이 아닐 때만 ChildFeature()의 Reducer가 동작함
  .ifLet(\.$child, action: \.child) {
      ChildFeature()
  }
}

 

 

요약

ifLet은 TCA에서 “있을 수도 있고 없을 수도 있는 자식 화면의 스위치”이다. 스위치가 켜지면 (nil이 아니면) 자식 로직을 작동시키고, 스위치가 꺼지면 (nil이면) 자식의 모든 동작을 깔끔히 끄고 정리하는 스위치 역할이다.

댓글