为什么 SwiftUI 在我尝试使用控制流时会抛出错误?



为什么 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])")
}
}

相关内容

  • 没有找到相关文章

最新更新