最佳答案
看起来苹果新的 SwiftUI
框架使用了一个 新的语法,它有效地构建了一个元组,但是有另一种语法:
var body: some View {
VStack(alignment: .leading) {
Text("Hello, World") // No comma, no separator ?!
Text("Hello World!")
}
}
试图解决这个语法实际上是 的问题时,我发现这里使用的 VStack
初始化器采用类型 () -> Content
的闭包
作为第二个参数,其中 Content
是通过闭包推断的符合 View
的通用参数。为了找出推断出的 Content
类型,我对代码稍作修改,以保持其功能:
var body: some View {
let test = VStack(alignment: .leading) {
Text("Hello, World")
Text("Hello World!")
}
return test
}
通过这种方法,test
显示为 VStack<TupleView<(Text, Text)>>
类型,这意味着 Content
是 TupleView<Text, Text>
类型。查找 TupleView
,我发现它是一个源自 SwiftUI
本身的包装类型,只能通过传递它应该包装的元组来初始化。
提问
现在我想知道这个例子中的两个 Text
实例是如何转换成 TupleView<(Text, Text)>
的。这是否被分解成 SwiftUI
,因此 无效的正规 Swift 语法? TupleView
是 SwiftUI
类型支持这个假设。或者是这个 有效的 Swift 语法?如果是的,怎么可能一个 在 SwiftUI
之外使用?