当前位置: 首页 > 面试题库 >

在SwiftUI ViewBuilder块中切换语句的替代方法?

章海
2023-03-14
问题内容

2020年6月23日编辑:从Xcode 12开始,ViewBuilder将同时支持switch和let语句!

我一直在尝试使用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()
         ...
      }
   }
}

不幸的是,我收到警告:

包含控制流语句的闭包不能与function builder一起使用ViewBuilder

因此,是否有其他选择可以切换,以便我可以复制此行为?


问题答案:

️2020年6月23日编辑:从Xcode 12开始,ViewBuilder将同时支持switch和let语句!

谢谢大家的回答。我已经在 Apple开发论坛 上找到了解决方案。 基尔·吉拉德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())
     ... 
  }
}


 类似资料:
  • 问题内容: Java中goto关键字的替代功能是什么? 由于Java没有goto。 问题答案: 你可以使用带标签的BREAK语句: 但是,在正确设计的代码中,你不需要GOTO功能。

  • null 代码如下所示: 和我想提高的班级: 我该怎么办?每个字段都在使用,但每个触发器都在使用。另外,这种情况有点特殊(OnFinalMethod需要参数)。基于上面的文章,我尝试重构这段代码,但没有成功。 你知道吗?:)

  • 问题内容: 除了看起来不太好以外,是否有其他替代方法可以在Java中实现切换案例。根据选择必须执行的方法,一组值会组合在一起。 问题答案: 想必您正在努力满足案件不变的要求。通常,这是代码气味,但是您可以做一些事情。您可能想提出并链接到另一个详细说明您为何尝试切换的问题。 在上面的示例中,您可能想要映射到“处理程序”,例如 然后,这一切都变成了查找。 同样,这有点气味,因此请发布一个说明原因的问题

  • 问题内容: 我想用Python编写一个函数,该函数根据输入索引的值返回不同的固定值。 在其他语言中,我将使用语句,但是Python似乎没有语句。在这种情况下,推荐的Python解决方案是什么? 问题答案: 你可以使用字典:

  • 问题内容: 因此,我今天编写了一种方法,该方法结合了嵌套开关语句的使用,并且代码对我来说看起来很简洁明了,但是有人告诉我,嵌套开关语句通常不是最好的处理方法,因为它们可能会使更多的语句变得混乱。切换添加的语句。这是我的代码的示例: 因此,我的问题是,从本质上讲,什么是这些switch语句的合适替代方案? 问题答案: 我建议您用对过程的调用替换每个嵌套的switch语句,然后该过程将执行嵌套的swi

  • 我想用Python编写一个函数,根据输入索引的值返回不同的固定值。 在其他语言中,我会使用或语句,但Python似乎没有语句。在这个场景中,推荐的Python解决方案是什么?