SwiftUI中身体的结构是什么?

SwiftUI中身体的结构是什么?,swift,xcode,swiftui,Swift,Xcode,Swiftui,嗨。我是Swift的新手,所以我有一些难以理解的代码结构。上面的代码是SwiftUi教程中的一个示例 如何将结构列成花括号?花括号是做什么用的?是那些闭包,并在这些闭包中返回一些结构的实例?我唯一能理解的是调用方法部件。 对不起,我的英语很差。神奇的是,SwiftUI视图的主体函数被定义为一种称为“函数生成器”的东西。其想法是允许SwiftUI成为Swift中的一种特定于领域的语言。您可以使用函数构建器来创建自己的DSL,函数构建器也称为“结果构建器” 例如,从“function builder

嗨。我是Swift的新手,所以我有一些难以理解的代码结构。上面的代码是SwiftUi教程中的一个示例

如何将结构列成花括号?花括号是做什么用的?是那些闭包,并在这些闭包中返回一些结构的实例?我唯一能理解的是调用方法部件。
对不起,我的英语很差。

神奇的是,SwiftUI视图的主体函数被定义为一种称为“函数生成器”的东西。其想法是允许SwiftUI成为Swift中的一种特定于领域的语言。您可以使用函数构建器来创建自己的DSL,函数构建器也称为“结果构建器”

例如,从“function builder”Swift语言提案中,这就是function builder的想法:

var body: some View {
    ScrollView {
        MapView(coordinate: landmark.locationCoordinate)
            .ignoresSafeArea(edges: .top)
            .frame(height: 300)
        
        CircleImage(image: landmark.image)
            .offset(y: -130)
            .padding(.bottom, -130)
        VStack(alignment: .leading) {
            HStack {
                Text(landmark.name)
                    .font(.title)
                FavoriteButton(isSet: $modelData.landmarks[landmarkIndex].isFavorite)
            }
            
            HStack {
                Text(landmark.park)
                Spacer()
                Text(landmark.state)
            }
            .font(.subheadline)
            .foregroundColor(.secondary)
            
            Divider()
            
            Text("About \(landmark.name)")
                .font(.title2)
            Text(landmark.description)
        }
        .padding()
    }
    .navigationTitle(landmark.name)
    .navigationBarTitleDisplayMode(.inline)
}

另一个魔术是Swift的“尾随闭包语法”,它也被用来让许多API感觉更像控制流,或者至少是语言的一部分。

SwiftUI的主体是函数吗?它似乎是一个符合视图的不透明类型变量。主体不是函数。如果您查看标题,“公共协议视图”的“body”属性标记为@ViewBuilder,而ViewBuilder是一个标记为@u functionBuilder的结构-这些“functionBuilder”东西是语法糖,让我们可以用Swift构建特定于域的语言。您可以创建自己的函数生成器:声明一个结构,将其标记为@u functionBuilder。添加至少接受一个参数的静态方法“buildBlock”。调用函数生成器时,此参数将位于大括号内。
func div(@HTMLBuilder makeChildren: () -> [HTML]) -> HTMLNode { ... }

div {
  if useChapterTitles {
    h1("1. Loomings.")
  }
  p {
    "Call me Ishmael. Some years ago"
  }
  p {
    "There is now your insular city"
  }
}