web-dev-qa-db-ja.com

SwiftUI ViewBuilderブロックのswitchステートメントの代替?

私はSwiftUIを使用して私のアプリを複製しようとしています。列挙型の値に応じて、異なる子ビューコントローラーを表示するRootViewControllerがあります。 SwiftUIでは、ビューコントローラーの代わりにビューを使用するため、私のコードは次のようになります。

struct RootView : View {
   @State var containedView: ContainedView = .home

   var body: some View {
      // custom header goes here
      switch containedView {
         case .home: HomeView()
         case .categories: CategoriesView()
         ...
      }
   }
}

残念ながら、私は警告を受け取ります:

制御フローステートメントを含むクロージャは、関数ビルダーViewBuilderでは使用できません。

それで、この動作を再現できるように切り替える代替手段はありますか?

33
Nikolay Marinov

VStackGroupなどのビューでコードをラップする必要があります。

var body: some View {
   Group {
       switch containedView {
          case .home: HomeView()
          case .categories: CategoriesView()
          ...
       }
   }
}

または、戻り値の追加が機能するはずです:

var body: some View {
    switch containedView {
        case .home: return HomeView()
        case .categories: return CategoriesView()
        ...
    }
}

ただし、この問題を解決する最善の方法は、ビューを返すメソッドを作成することです。

func nextView(for containedView: YourViewEnum) -> some AnyView {
    switch containedView {
        case .home: return HomeView()
        case .categories: return CategoriesView()
        ...
    }
}

var body: some View {
    nextView(for: containedView)
}
0
LinusGeffarth