[TCA] enum State をstruct Stateに持たせる場合のpullback方法

# 問題
`The Composable Architecture`の`SwitchStore`での画面出し分けをする際、enumにStateを持たせる場合、以下のようにpullbackします。

```swift:AppCore.swift
enum AppState {
    case firstScreen(FirstScreenState)
    case secondScreen(SecondScreenState)
}

enum AppAction {
    case firstScreenAction(FirstScreenAction)
    case secondScreenAction(SecondScreenAction)
}

struct AppEnvironment { }

let appReducer = Reducer<AppState, AppAction, AppEnvironment>.combine(
    firstScreenReducer
        .pullback(
            state: /AppState.firstScreen,
            action: /AppAction.firstScreenAction,
            environment: { _ in
                .init()
            }
        ),
    
    secondScreenReducer
        .pullback(
            state: /AppState.secondScreen,
            action: /AppAction.secondScreenAction,
            environment: { _ in
                .init()
            }
        ),
    
    Reducer { state, action, _ in
        switch action {
            //...
        }
    }
)
```
```swift:AppView.swift
struct AppView: View {
    let store: Store<AppState, AppAction>
    
    var body: some View {
        SwitchStore(store) {
            CaseLet(state: /AppState.firstScreen, action: AppAction.firstScreenAction) {
                FirstScreen(store: $0)
            }
            
            CaseLet(state: /AppState.secondScreen, action: AppAction.secondScreenAction) {
                SecondScreen(store: $0)
            }
        }
    }
}

```



しかし以下のように、`Stateを持たせたenum`を`structのState`に持たせたい場合には、当然ながら同様の方法ではpullbackすることができません。
```diff_swift:AppCore.swift
enum AppScreen {
    case firstScreen(FirstScreenState)
    case secondScreen(SecondScreenState)
}

struct AppState {
+    var appScreen: AppScreen = .firstScreen(.init())
}

// 省略...
```

# 2重pullbackで解決
そこで、以下のように2重でpullbackすることで解決します。
```diff_swift:AppCore.swift
// 省略...

let appReducer = Reducer<AppState, AppAction, AppEnvironment>.combine(
    firstScreenReducer
        .pullback(
-           state: /AppState.firstScreen,
+           state: /AppScreen.firstScreen,
            action: /AppAction.firstScreenAction,
            environment: { _ in
                .init()
            }
        )
+       .pullback(
+           state: \.appScreen,
+           action: /AppAction.self,
+           environment: { $0 }
+       ),
    
    secondScreenReducer
        .pullback(
-           state: /AppState.secondScreen,
+           state: /AppScreen.secondScreen,
            action: /AppAction.secondScreenAction,
            environment: { _ in
                .init()
            }
        )
+       .pullback(
+           state: \.appScreen,
+           action: /AppAction.self,
+           environment: { $0 }
+       ),
    
    // 省略...
)
```
```diff_swift:AppView.swift
struct AppView: View {
    let store: Store<AppState, AppAction>
    
    var body: some View {
-       SwitchStore(store) {
+       SwitchStore(store.scope(state: \.appScreen)) {
-           CaseLet(state: /AppState.firstScreen, action: AppAction.firstScreenAction) {
+           CaseLet(state: /AppScreen.firstScreen, action: AppAction.firstScreenAction) {
                FirstScreen(store: $0)
            }
            
-           CaseLet(state: /AppState.secondScreen, action: AppAction.secondScreenAction) {
+           CaseLet(state: /AppScreen.secondScreen, action: AppAction.secondScreenAction) {
                SecondScreen(store: $0)
            }
        }
    }
}
```

### 参考
https://forums.swift.org/t/pullback-reducer-on-enum-property-switchstore/52628