💨

TCAバージョン1.5マイグレーションまとめ

2023/11/27に公開

TCA v1.5.0

scope(state:action:)のキーパス対応

  • 1.4で登場したCaseKeyPathマクロ(CasePathがキーパスで書けるようになるマクロ)の影響
  • 第二引数(action)はクロージャだったが、キーパスを取れるメソッドが追加された
    // before
    ChildView(
        store: self.store.scope(
            state: \.child, 
            action: { .child($0) }
        )
    )
    
    // after🆕
    ChildView(
        store: self.store.scope(
            state: \.child, 
            action: \.child
        )
    )
    
  • 旧scope(state:action:)はsoft-deprecatedとなっている
    • soft-deprecated: 将来的に廃止
  • キーパスがHashableに準拠しているため、スコープメソッドはストアをキャッシュすることが可能になるとのこと
    • 同じStateとActionでスコープした場合は、キャッシュから作成済みのストアを利用することでパフォーマンスが向上する⏫

列挙型ナビゲーション(ナビゲーションAPIの改善)

  • スコープメソッドと同じく、ナビゲーションを行うAPIにもCaseKeyPathの対応が入った
    // before
    .sheet(
        store: self.store.scope(state: \.$destination, action: { .destination($0) }),
        state: \.editForm,
        action: { .editForm($0) }
    )
    
    // after🆕
    .sheet(
        store: self.store.scope(
            state: \.$destination.editForm, 
            action: \.destination.editForm
        )
    )
    
  • スコープメソッド同様に旧メソッドはsoft-deprecatedとなった。対象となるのはstore, state, actionの引数を持つメソッド
    • alert(store:state:action:)
    • confirmationDialog(store:state:action:)
    • fullScreenCover(store:state:action:)
    • navigationDestination(store:state:action)
    • popover(store:state:action:)
    • sheet(store:state:action:)
    • IfLetStore.init(_:state:action:then:)
    • IfLetStore.init(_:state:action:then:else:)
  • 列挙型ナビゲーションって訳したけど、本家はEnum-driven navigationです

まとめ

  • リリース速度はっやい
  • はっやいけど、1.4のリリース内容を理解していれば馴染みやすリリースでした

Discussion