如何指定包含SwiftUI自定义视图的数组的类型信息

如何指定包含SwiftUI自定义视图的数组的类型信息,swift,swiftui,Swift,Swiftui,我正在学习SwiftUI,我知道要使用SwiftUI框架创建视图元素,您的自定义类型必须符合“视图”协议。我有一个要求,我想声明一个数组,其中包含我将通过创建一个实现“视图”协议的结构来创建的自定义SwiftUI组件。现在我不确定数组的类型应该提到什么,因为提供“视图”作为类型会导致编译器错误为“协议“视图”只能用作一般约束,因为它具有自身或关联的类型要求。” 下面是根据一些模型枚举生成不同视图的可能方法的演示。使用Xcode 11.4/iOS 13.4进行测试 enum customtabd

我正在学习SwiftUI,我知道要使用SwiftUI框架创建视图元素,您的自定义类型必须符合“视图”协议。我有一个要求,我想声明一个数组,其中包含我将通过创建一个实现“视图”协议的结构来创建的自定义SwiftUI组件。现在我不确定数组的类型应该提到什么,因为提供“视图”作为类型会导致编译器错误为“协议“视图”只能用作一般约束,因为它具有自身或关联的类型要求。”


下面是根据一些模型枚举生成不同视图的可能方法的演示。使用Xcode 11.4/iOS 13.4进行测试

enum customtabdescriptor:Int{
案例一=1
案例二=2
案例三=3
变量标签:字符串{
“\(self.rawValue).square”
}
//也可以用于具有要在内部传递的参数的函数
//创建了相应的视图
var视图:一些视图{
团体{
如果self=.1{

Text(“One”)//这不是快速的方向…尝试使用数组代替模型(或视图模型)对象并根据它们在主体中创建相应的视图。看一看苹果的教程:为什么要在另一个视图上存储视图数组?您要实现的是什么?非常感谢您的回答。我试图构建一个自定义选项卡视图,以便能够动态传入一些参数构建选项卡栏。我是根据使用UITabBarController构建类似内容的经验来解决此问题的。这就是为什么要使用包含视图组件的数组。您的代码在SwiftUI中为我提供了正确的方法。谢谢!!。编译器错误与使用“具有关联类型的协议”作为类型有关这不是特定于SwiftUI的。
struct ContentView: View {
    
    var tabs : [View]
    
    var body: some View {
        Text("Hello World")
    }
}
enum CustomTabDescriptior: Int {
    case one = 1
    case two = 2
    case three = 3

    var label: String {
        "\(self.rawValue).square"
    }

    // can be used also a function with arguments to be passed inside
    // created corresponding views
    var view: some View {
        Group {
            if self == .one {
                Text("One")    // << any custom view here or below
            }
            if self == .two {
                Image(systemName: "2.square")
            }
            if self == .three {
                Button("Three") {
                    print(">> activated !!")
                }
            }
        }
    }
}

struct DemoDynamicTabView: View {
    let tabs: [CustomTabDescriptior] = [.one, .two, .three]
    var body: some View {
        TabView {
            ForEach(tabs, id: \.self) { tab in
                tab.view
                    .tabItem {
                        Image(systemName: tab.label)
                    }
            }
        }
    }
}