为什么 SwiftUI 喜欢抛出这样的错误
包含控制流语句的闭包不能与函数生成器"ViewBuilder"一起使用
当我只是尝试类似的东西时
VStack {
for i in 0...10 {
Text("Hello, world!")
}
}
它不会编译。为什么斯威夫特关心?SwiftUI 框架如何检测是否存在控制流语句并抛出错误?
SwiftUI 框架如何检测是否存在控制流语句并抛出错误?
其实不然。Swift语言(即编译器(检测到这一点。它不是"抛出错误",它只是说你的代码在语法上无效,所以它无法编译它。
要了解原因,请问问自己语法是什么
VStack {
// ...
}
它是 VStack 结构的初始值设定项,由函数构建器调解,它基本上改变了 Swift 语法的工作方式,将其转变为特定于领域的语言。您正在调用此方法:
https://developer.apple.com/documentation/swiftui/vstack/3278367-init
大括号中的东西是最后一个参数:
@ViewBuilder content: () -> Content
所以这是一个函数的函数体,它必须返回一个内容,这是一种视图。由于函数构建器的工作方式,您在这里唯一可以做的就是返回一个视图 — 或者,多亏了函数构建器,您可以说出一系列 View 对象,它们将为您组合并返回。这就是你在这个背景下被允许做的一切。
您的用例正是提供 ForEach 结构的原因:这样您就可以在函数构建器的域内循环生成 View 对象。
您无法在 ViewBuilder 中执行此操作,但可以执行此操作:
VStack {
ForEach (0..<10) {_ in
Text("hello world")
}
}
如果要处理数组,则可以使用变量而不是下划线。
VStack {
ForEach (0..<10) {i in
Text("(array[i])")
}
}