SwiftUI TupleView和泛型,如何递归解析某些视图和组的元组

SwiftUI TupleView和泛型,如何递归解析某些视图和组的元组,swift,generics,swiftui,Swift,Generics,Swiftui,我有一个具有不同类型视图的元组,这些视图是一些视图,也可能有一些组也是泛型类型。现在我考虑如何解析这样的结构来实现视图数组。 以下是初始化器和调试器屏幕截图 public init<A: View, B: View>(@ViewBuilder content: () -> TupleView<(A, B)>) { let views = content().value self.childs = [AnyView(views.0), AnyVie

我有一个具有不同类型视图的元组,这些视图是
一些视图
,也可能有一些组也是泛型类型。现在我考虑如何解析这样的结构来实现视图数组。 以下是初始化器和调试器屏幕截图

public init<A: View, B: View>(@ViewBuilder content: () -> TupleView<(A, B)>) {

    let views = content().value

    self.childs = [AnyView(views.0), AnyView(views.1)]
}
public init

更新1

我尝试实现@ViewBuilder返回两个组的TupleView的初始值设定项,然后通过实现所有初始值设定项的排列,我可以在ViewBuilder中启用组的不同组合

public init<A: View, B: View>(@ViewBuilder content: () -> TupleView<(Group<A>, Group<B>)>)  {

        let groups = content().value

        groups.0.content...
        groups.1.content... // here content is internal
}
public init(@ViewBuilder content:()->TupleView){
让组=content().value
组。0。内容。。。
groups.1.content…//这里的内容是内部的
}
但这里的问题是,groups.0是第一组 不提供对内容属性的公共访问(标记为内部) 因此,我无法访问此属性的内容。我甚至试过Mirror(reflecting:groups.0),但它也没用,因为我无法将它的子对象值转换为适当的TupleView,因为我不知道?泛型类型

更新2

因此,现在唯一的解决方法是实现我自己的自定义分组视图,而不是分组,这样可以在自定义容器中添加10个以上的视图,然后像我一样布局这些视图

struct Grouping: View {

    let childs : [AnyView]

    var body: some View {
        EmptyView()
    }

    public init<A: View>(@ViewBuilder content: () -> A) {
           // this init will be used for any non-supported number of TupleView

           let view = content()
           self.childs = [AnyView(view)]
       }

    // MARK: TupleView support
    public init<A: View, B: View>(@ViewBuilder content: () -> TupleView<(A, B)>) {

           let views = content().value

           self.childs = [AnyView(views.0), AnyView(views.1)]

    }

    // ... other 10 init permutations returning TupleView of views 
}
结构分组:视图{ let childs:[AnyView] var body:一些观点{ EmptyView() } public init(@ViewBuilder content:()->A){ //此初始化将用于任何不受支持的TupleView数 让视图=内容() self.childs=[AnyView(view)] } //马克:TupleView支持 public init(@ViewBuilder content:()->TupleView){ 让视图=内容().value self.childs=[AnyView(views.0),AnyView(views.1)] } //…其他10个初始排列返回视图视图 }
在我的自定义容器视图中我可以实现inits,它接受这个分组TupleView

public init(@ViewBuilder content: () -> TupleView<(Grouping, Grouping)>) {

        let groups = content().value
        self.childs = groups.0.childs + groups.1.childs

    }
public init(@ViewBuilder content:()->TupleView){
让组=content().value
self.childs=groups.0.childs+groups.1.childs
}
这项工作很难完成。我不明白苹果为什么不提供对群组内容及其子视图的公共访问。通过这种方式,我们制作自定义布局组件的方法非常有限

您可以尝试以下方法:

func recursiveViewToViewList<V0: View>(viewGroup: V0) -> [AnyView] {
    [AnyView(viewGroup)]
}
func recursiveViewToViewList<V0: View, V1: View>(viewGroup: TupleView<(V0,V1)>) -> [AnyView] {
    []
        + recursiveViewToViewList(viewGroup: viewGroup.value.0)
        + recursiveViewToViewList(viewGroup: viewGroup.value.1)
}
func recursiveViewToViewList<V0: View, V1: View, V2: View>(viewGroup: TupleView<(V0,V1,V2)>) -> [AnyView] {
    []
        + recursiveViewToViewList(viewGroup: viewGroup.value.0)
        + recursiveViewToViewList(viewGroup: viewGroup.value.1)
        + recursiveViewToViewList(viewGroup: viewGroup.value.2)
}
func recursiveViewToViewList<V0: View, V1: View, V2: View, V3: View>(viewGroup: TupleView<(V0,V1,V2,V3)>) -> [AnyView] {
    []
        + recursiveViewToViewList(viewGroup: viewGroup.value.0)
        + recursiveViewToViewList(viewGroup: viewGroup.value.1)
        + recursiveViewToViewList(viewGroup: viewGroup.value.2)
        + recursiveViewToViewList(viewGroup: viewGroup.value.3)
}
func recursiveViewToViewList<Data: Collection, ID: Hashable, Content: View>(viewGroup: ForEach<Data, ID, Content>) -> [AnyView] {
    viewGroup.data.flatMap {
        recursiveViewToViewList(viewGroup: viewGroup.content($0))
    }
}
struct Grouping: View {
    let childs: [AnyView]
    public init<A: View>(@ViewBuilder content: () -> A) {
        childs = recursiveViewToViewList(viewGroup: content())
    }
}

func recursiveViewToViewList(视图组:V0)->[AnyView]{
[任意视图(视图组)]
}
func recursiveViewToViewList(视图组:TupleView)->[AnyView]{
[]
+recursiveViewToViewList(视图组:viewGroup.value.0)
+recursiveViewToViewList(视图组:viewGroup.value.1)
}
func recursiveViewToViewList(视图组:TupleView)->[AnyView]{
[]
+recursiveViewToViewList(视图组:viewGroup.value.0)
+recursiveViewToViewList(视图组:viewGroup.value.1)
+recursiveViewToViewList(视图组:viewGroup.value.2)
}
func recursiveViewToViewList(视图组:TupleView)->[AnyView]{
[]
+recursiveViewToViewList(视图组:viewGroup.value.0)
+recursiveViewToViewList(视图组:viewGroup.value.1)
+recursiveViewToViewList(视图组:viewGroup.value.2)
+recursiveViewToViewList(视图组:viewGroup.value.3)
}
func recursiveViewToViewList(视图组:ForEach)->[AnyView]{
viewGroup.data.flatMap{
recursiveViewToViewList(视图组:viewGroup.content($0))
}
}
结构分组:视图{
let childs:[AnyView]
public init(@ViewBuilder content:()->A){
childs=recursiveViewToViewList(视图组:content())
}
}
编辑:这不起作用。重载解析是在泛型实现之前完成的,因此当泛型参数上只有
:View
约束时,只解析第一个函数(基本情况)。最好的办法可能是在那里进行动态分派(可能是使用反射,因为您无法使用开放参数对泛型进行类型检查),尽管我不知道这是否可行,也不知道如何进行