1. ホーム
  2. swift

[解決済み] SwiftUI ViewBuilderブロックのswitchステートメントに代わるもの?

2023-07-26 08:21:36

質問

⚠️ 2020年6月23日 編集:Xcode 12から、switch文とif let文の両方がViewBuilderでサポートされることになりました!

私はSwiftUIを使用して私のアプリを複製しようとしてきました。RootViewController があり、enum 値に依存して、異なる子ビューコントローラを表示します。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 .

それで、この動作を再現できるように、switchに代わるものはありますか?

どのように解決するのですか?

⚠️ 2020年6月23日 編集:Xcode 12から、switch文とif let文の両方がViewBuilderでサポートされるようになります!(*^^*)

皆さん、回答ありがとうございます。で解決策を見つけました。 Apple の Dev Forums . それはによって答えられる Kiel Gillard . 解決策は、Lu_、Linus、Moが提案したように、スイッチを関数で抽出することですが、ビューをラップするために AnyView でラップする必要があります。

struct RootView: View {
  @State var containedViewType: ContainedViewType = .home

  var body: some View {
     VStack {
       // custom header goes here
       containedView()
     }
  }

  func containedView() -> AnyView {
     switch containedViewType {
     case .home: return AnyView(HomeView())
     case .categories: return AnyView(CategoriesView())
     ... 
  }
}