如何从 SwiftUI 的官方教程代码中解释 VStack{ .. } ?

sto*_*one 8 swift swiftui

在下面的代码中,我知道

  1. body是一个只有get一部分的计算属性。
  2. return 省略 VStack

但是{ .. }Vstack 之后是什么?这是初始化还是闭包?{} 里面有什么,我认为没有任何回报。

struct ContentView: View {
    var body: some View {
        VStack {
            MapView()
                .frame(height: 300)

            CircleImage()
                .offset(y: -130)
                .padding(.bottom, -130)

            VStack(alignment: .leading) {
                Text("Turtle Rock")
                    .font(.title)
                HStack(alignment: .top) {
                    Text("Joshua Tree National Park")
                        .font(.subheadline)
                    Spacer()
                    Text("California")
                        .font(.subheadline)
                }
            }
            .padding()

            Spacer()
        }
    }
}

Run Code Online (Sandbox Code Playgroud)

Swe*_*per 7

如果您查看 的文档VStack.init,您会发现它接受的最后一个参数确实是一个闭包。这里的神奇之处在于闭包标有@ViewBuilder

@ViewBuilder是一种函数构建器。这个想法是你传入一个包含一堆表达式,然后函数构建器将这些表达式组合成一个单一的值。这有点像返回一个数组,但使用一种可以说是更好看的语法。(虽然它不是真正的数组。闭包的返回类型由函数构建器决定。)

在您的代码中,您将返回一个包含 4 个视图的“数组”。

  1. MapView
  2. CircleImage
  3. 其他 VStack
  4. Spacer

这些将传递给ViewBuilder,并将所有这些组合成一个View对象。

如果您想知道在每个视图末尾调用的方法在做什么,它们只是返回对调用它们的对象的轻微修改的方法。例如padding返回相同的视图,但应用了一些填充。