NavigationViewの最初のViewを指定する

SwiftUIにおいて、次のような画面遷移をするNavigationViewがあるとします。

このNavigationViewはsheetによって表示され、親のViewからは直接中間以降の画面を開けるボタンが配置されています。

これらを愚直に実装する場合、次のようなパターンのNavigationViewを実装することになります。

TCAでこれらを実装する場合、それぞれのパターンごとに根元のStateを保持する必要があります。

しかし、この実装方法はreducerが複雑になる問題があります。

例えば、cartのdoneボタンを親が検知するには次のようなreducerを書く必要があります。

各パターンを網羅する必要があり、1つの遷移パターンのdoneボタンをタップするだけでは正常に動作するかを確認できません。


これらの問題を解決するには、親になるStateに各画面遷移先を持たせ最初の画面に応じてNavigationLinkを組み立てる必要があります。

また、TCAではIfLetStoreで生成されるViewはstateの型一致を求められるため、次のようなModifierを作って後からNavigationLinkを埋め込めるようにしています。

これによって、Stateがネストすることなく親の下にフラットに並べることが出来ました。

Actionも次のようにシンプルになります

また、通常であれば親は1階層下のNavigationLinkしか制御できませんがこの方式を採用すると2階層以下の画面遷移も親が制御出来るというメリットがあります。


追記:

TCAではIfLetStoreで生成されるViewはstateの型一致を求められるため

これは嘘でした

こうすれば、thenの中で諸々組めます