🎯

TCA で struct State の中にある enum を取り扱う方法

2023/01/22に公開約1,300字
struct ExampleReducer: ReducerProtocol {
  struct State: Equatable {
    enum ExampleEnum: Equatable {
      case hoge(Hoge.State)
      case fuga(Fuga.State)
    }

    var example: ExampleEnum?
  }
  
  enum Action: Equatable {
    case hoge(Hoge.Action)
    case fuga(Fuga.Action)
  }
  
  // ...
}

上記のように struct State の中で、複数の State から構成されるような enum を保持している場合、Reducer では以下のように取り扱うことができます。(Scope して更に Scope するというイメージ)

var body: some ReducerProtocol<State, Action> {
  Scope(state: \.example, action: /.self) {
    Scope(state: /State.ExampleEnum.hoge, action: /Action.hoge) {
      HogeReducer()
    }
    Scope(state: /State.ExampleEnum.fuga, action: /Action.fuga) {
      FugaReducer()
    }
  }
}

View では例えば以下のように利用できます。

var body: some View {
  IfLetStore(
    store.scope(state: \.example),
    then: { store in
      SwitchStore(store) {
        CaseLet(
	  state: /ExampleReducer.State.ExampleEnum.hoge,
	  action: ExampleReducer.Action.hoge,
	  then: HogeView.init
	)
	CaseLet(
	  state: /ExampleReducer.State.ExampleEnum.fuga,
	  action: ExampleReducer.Action.fuga,
	  then: FugaView.init
	)
      }
    }
  )
}

参考

Discussion

ログインするとコメントできます