从 Swift 中的闭包返回多个 View 对象

Returning multiple View objects from a closure in Swift

我经常看到这样的代码:

VStack {
  Text("A")
  Text("B")
}

通过查看 swift 教程,我知道这是 shorthand 用于将闭包指定为函数的最后一个参数。但是,afaik 如果未指定 return 关键字,则闭包将隐式 return 内部表达式的结果。

在这种情况下,有两个 Text 对象。它们 return 是元组还是列表?我知道它有效,但我不清楚,闭包中 return 到底是什么。

当我们看到这段代码时:

VStack {
  Text("A")
  Text("B")
}

不清楚会return编辑什么,除非我们使用VStack,然后SwiftUI知道我们想要什么,代码可能是这样的:

HStack {
  Text("A")
  Text("B")
}

这里也不清楚我们想要什么,除非我们对SwiftUI说我们想要HStack,但是如果你这样使用:

CustomView {
  Text("A")
  Text("B")
}

SwiftUI return 它总是作为VStack里面的内容!同样在我所说的所有这些情况下,Swift 与 @ViewBuilder 一起工作来实现这一点。他们是元组。

ViewBuilder Apple

最初省略 return 语句的能力是在 Swift Evolution 255 中引入的 - 此更改仅允许单个 return 值。事实上,return 多个值的能力在该提案中被考虑并被放弃。

您所问的结构最初是由Apple作为支持SwiftUI的私有实现引入的,但现在已在Swift Evolution 289 - Function Builders中正式采用。

通过参考该文档的 introduction 部分,您可以看到这些值确实 return 编辑为元组。

// Original source code:
@TupleBuilder
func build() -> (Int, Int, Int) {
  1
  2
  3
}

// This code is interpreted exactly as if it were this code:
func build() -> (Int, Int, Int) {
  let _a = TupleBuilder.buildExpression(1)
  let _b = TupleBuilder.buildExpression(2)
  let _c = TupleBuilder.buildExpression(3)
  return TupleBuilder.buildBlock(_a, _b, _c)
}

SwiftUI 自动 returns 两个 Text 在一个类型的 TupleView 中。 Swift 的 resultBuilder 是魔法,它是 SE0289:https://github.com/apple/swift-evolution/blob/main/proposals/0289-result-builders.md