Ios 动态视图渲染,SwiftUI

Ios 动态视图渲染,SwiftUI,ios,performance,struct,view,swiftui,Ios,Performance,Struct,View,Swiftui,假设我有一个结构: var topMenu: [TopMenu] = [TopMenu(name: "Menu", index: 1), TopMenu(name: "Search", index: 2), TopMenu(name: "Profile", index: 3), TopMenu(name:

假设我有一个结构:

var topMenu: [TopMenu] = [TopMenu(name: "Menu", index: 1),
                      TopMenu(name: "Search", index: 2),
                      TopMenu(name: "Profile", index: 3),
                      TopMenu(name: "Settings", index: 4)]
这个结构包含一个字符串和一个索引,因此我可以使用这些元素基于HStack和ForEach创建一个菜单。这很好。但我现在要做的是:

假设这个结构是动态的:我可以有3个元素,但也可以有5/6个元素(基于后端调用)。我想为每个元素呈现一个不同的视图(单击)。目前,基于我们的索引,我正在使用一个简单的if进行此操作:

if self.index == 1 {
      First()
} else if self.index == 2 {
      Second()
} else if self.index == 3 {
      Third()
} else {
      First()
}
但是如果我有更多的元素等,这不是最好的方法

我的想法如下,但我不知道最好的方法是什么:

  • 创建一个函数,该函数根据索引返回
    任何视图
    ,并为每个视图指定一个默认名称,以便我可以迭代?例如View1、View2等

  • 在我的结构中添加特定的内容

另外,我也希望以更安全的方式进行操作,我不想撞车等!)


谢谢大家!

这里是SwiftUI 2.0中可能的方法(在SwiftUI 1.0中,ViewBuilder尚不支持
开关
,因此
if/else
是唯一的方法,但您也可以将其包装在
枚举
中)

此外,您还可以选择修改
TopMenu
,将其直接链接到枚举案例,而不是索引,如
TopMenu(名称:“Menu”,标记:.Menu)


非常感谢您的回答!这很好,但我的问题中仍然遗漏了一些东西:如果(在后端调用之后)我发现有6个视图而不是4个视图,该怎么办?我想我需要更有活力的东西!还是我的问题很奇怪?不管有多少视图,你都需要声明它们并在某处创建它们。好的,这是正确的。所以我设置了一个限制,比如说最大6个视图,然后我创建了所有视图。我只渲染我需要的。请问,我该如何使用这个奇妙的枚举?我的意思是,目前我在一个VStack中有if语句,它包含了带有菜单、搜索、设置(带索引)等的HStack。但是当我点击其中一个时,我该如何使用枚举来呈现正确的视图?谢谢你,伙计,我真的很抱歉,这就是我一直在寻找的。有可能我们遗漏了什么吗?我刚刚测试了代码,并通过一个简单的检查,比如(Choices.menu).view()来检查它是否有效,但什么都没有发生
enum Choices: Int {
    case menu = 1
    case search = 2
    case profile = 3
    case settings = 4

    @ViewBuilder
    func view() -> some View {
        switch self {
            case menu:
                MenuView()
            case search:
                SearchView()
            case profile:
                ProfileView()
            case settings:
                SettingsView()
        }
    }
}

struct DemoChoicesUsage: View {
    @State var index = 1
    var body: some View {
        VStack {
            (Choices(rawValue: index) ?? Choices.menu).view()
        }
    }
}
struct TopMenu {
  let name: String
  let tag: Choices
}