如何在SwiftUI中通过ViewBuilder访问TupleView?

如何在SwiftUI中通过ViewBuilder访问TupleView?,swiftui,Swiftui,我正在尝试访问我的TupleView,我的ViewBuilder使用它来构建内容,然后我正在尝试计数,在这里我编写了代码,直到现在,我需要帮助找到我的TupleView的计数,现在由于未知的原因,它返回0,这是我期望的5!谢谢你的帮助 import SwiftUI struct ContentView: View { var body: some View { ModelView(content: { Text("Hello, w

我正在尝试访问我的TupleView,我的ViewBuilder使用它来构建内容,然后我正在尝试计数,在这里我编写了代码,直到现在,我需要帮助找到我的TupleView的计数,现在由于未知的原因,它返回0,这是我期望的5!谢谢你的帮助

    import SwiftUI
struct ContentView: View {
    var body: some View {
        ModelView(content: {
            Text("Hello, world! 1")
                .padding()
            Text("Hello, world! 2")
                .padding()
            Text("Hello, world! 3")
                .padding()
            Text("Hello, world! 4")
                .padding()
            Text("Hello, world! 5")
                .padding()
        })
    }
}

struct ModelView<Content: View>: View {
    var content: () -> Content
    init(@ViewBuilder content: @escaping () -> Content) {
        self.content = content
        let size = Mirror(reflecting: content).children.count   // <<: Here! it returns 0! which must be 5!
        print(size)
    }

    var body: some View {
        content()
    }
}
导入快捷界面
结构ContentView:View{
var body:一些观点{
ModelView(内容:{
文本(“你好,世界!1”)
.padding()
文本(“你好,世界!2”)
.padding()
文本(“你好,世界!3”)
.padding()
文本(“你好,世界!4”)
.padding()
文本(“你好,世界!5”)
.padding()
})
}
}
结构模型视图:视图{
变量内容:()->内容
初始化(@ViewBuilder内容:@escaping()->content){
self.content=内容

让size=Mirror(reflecting:content).children.count/首先,通过访问
Mirror(reflecting:content)
您反映的是创建
内容的闭包(您可以看到
内容
实际上是
()->内容
类型的闭包)

您可能想反映视图本身。为此,您需要反映特定实例:

let mirror = Mirror(reflecting: content()) // add the parentheses
然后,您尝试访问
子项
。如果您使用上面的镜像访问它,您将获得(为清晰起见,键入格式化):

您将得到以下结果:

(
    SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>(
        content: SwiftUI.Text(
            storage: SwiftUI.Text.Storage.anyTextStorage(
                SwiftUI.unknown context at $7fff57642368.LocalizedTextStorage
            ), modifiers: []
        ),
        modifier: SwiftUI._PaddingLayout(
            edges: SwiftUI.Edge.Set(rawValue: 15),
            insets: nil
        )
    ),
    SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>(...)
)
(
SwiftUI.ModifiedContent(
内容:SwiftUI.Text(
存储:SwiftUI.Text.storage.anyTextStorage(
SwiftUI.unknown上下文位于$7fff57642368.LocalizedTextStorage
),修饰语:[]
),
修改器:SwiftUI.\u填充布局(
边缘:SwiftUI.Edge.Set(原始值:15),
插图:无
)
),
SwiftUI.ModifiedContent(…)
)
这是类型为的元组:

(
    SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>,
    SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>,
    SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>,
    SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>,
    SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>
)
(
SwiftUI.ModifiedContent,
SwiftUI.ModifiedContent,
SwiftUI.ModifiedContent,
SwiftUI.ModifiedContent,
SwiftUI.ModifiedContent
)
这可能是你在这里通过反思所能得到的全部


重要提示

发件人:

游戏场和调试器使用镜像


你可能不应该在真正的应用程序中使用它。

首先,通过访问
镜像(反射:内容)
你正在反射创建
内容的闭包(你可以看到
内容
实际上是
()->内容
类型的闭包)

您可能想反映视图本身。为此,您需要反映特定实例:

let mirror = Mirror(reflecting: content()) // add the parentheses
然后,您尝试访问
子项
。如果您使用上面的镜像访问它,您将获得(为清晰起见,键入格式化):

您将得到以下结果:

(
    SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>(
        content: SwiftUI.Text(
            storage: SwiftUI.Text.Storage.anyTextStorage(
                SwiftUI.unknown context at $7fff57642368.LocalizedTextStorage
            ), modifiers: []
        ),
        modifier: SwiftUI._PaddingLayout(
            edges: SwiftUI.Edge.Set(rawValue: 15),
            insets: nil
        )
    ),
    SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>(...)
)
(
SwiftUI.ModifiedContent(
内容:SwiftUI.Text(
存储:SwiftUI.Text.storage.anyTextStorage(
SwiftUI.unknown上下文位于$7fff57642368.LocalizedTextStorage
),修饰语:[]
),
修改器:SwiftUI.\u填充布局(
边缘:SwiftUI.Edge.Set(原始值:15),
插图:无
)
),
SwiftUI.ModifiedContent(…)
)
这是类型为的元组:

(
    SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>,
    SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>,
    SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>,
    SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>,
    SwiftUI.ModifiedContent<SwiftUI.Text, SwiftUI._PaddingLayout>
)
(
SwiftUI.ModifiedContent,
SwiftUI.ModifiedContent,
SwiftUI.ModifiedContent,
SwiftUI.ModifiedContent,
SwiftUI.ModifiedContent
)
这可能是你在这里通过反思所能得到的全部


重要提示

发件人:

游戏场和调试器使用镜像

你不应该在真正的应用程序中使用它

如何在SwiftUI中通过ViewBuilder访问TupleView

与SwiftUI的方式完全相同。让我们看看
ViewBuilder的
buildBlock
是什么:

这意味着
ViewBuilder
对于从1到10的每一个内容视图计数都有明确的功能

extension ViewBuilder {
    public static func buildBlock<C0, C1, C2, C3>(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3) -> TupleView<(C0, C1, C2, C3)> where C0 : View, C1 : View, C2 : View, C3 : View
}
扩展视图生成器{ 公共静态func构建块(c0:c0,c1:c1,c2:c2,c3:c3)->TupleView,其中c0:View,c1:View,c2:View,c3:View }
因此,如果您想访问视图生成器元组视图,则需要执行相同的操作,如(使用Xcode 12.4测试)

struct ModelContentView:View{
var body:一些观点{
ModelView(内容:{
文本(“你好,世界!1”)
.padding()
文本(“你好,世界!2”)
.padding()
//文本(“你好,世界!3”)
//.padding()
//文本(“你好,世界!4”)
//.padding()
//文本(“你好,世界!5”)
//.padding()
})
}
}
结构模型视图:视图{
变量计数:Int
变量内容:()->内容
私有初始化(计数:Int=1,@ViewBuilder内容:@escaping()->content){
self.content=内容
self.count=计数
}
var body:一些观点{
内容()
}
}
扩展模型视图{
init(@ViewBuilder content:@escaping()->content),其中content==TupleView{
self.init(计数:2,内容:content)
}
init(@ViewBuilder content:@escaping()->content),其中content==TupleView{
self.init(计数:3,内容:content)
}
//…所有其他变体
}
如何在SwiftUI中通过ViewBuilder访问TupleView

与SwiftUI的方式完全相同。让我们看看
ViewBuilder的
buildBlock
是什么:

这意味着
ViewBuilder
对于从1到10的每一个内容视图计数都有明确的功能

extension ViewBuilder {
    public static func buildBlock<C0, C1, C2, C3>(_ c0: C0, _ c1: C1, _ c2: C2, _ c3: C3) -> TupleView<(C0, C1, C2, C3)> where C0 : View, C1 : View, C2 : View, C3 : View
}
扩展视图生成器{ 公共静态func构建块(c0:c0,c1:c1,c2:c2,c3:c3)->TupleView,其中c0:View,c1:View,c2:View,c3:View }
因此,如果您想访问视图生成器元组视图,则需要执行相同的操作,如(使用Xcode测试)