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
约束时,只解析第一个函数(基本情况)。最好的办法可能是在那里进行动态分派(可能是使用反射,因为您无法使用开放参数对泛型进行类型检查),尽管我不知道这是否可行,也不知道如何进行