问题是分配给milesPerGallon
与用于构建视图层次结构参数的“函数构建器语法”不能很好地配合。如果我们替换,它会变得更加明显@State var milesPerGallon
通过局部变量(即is,它不携带视图所依赖的状态,仅携带中间值):
if showMPGInfo {
Spacer()
let milesPerGallon = CalcMPG(start: startingMileage,
end: endingMileage, fuel: fuelAdded)
Text("Fuel effiency: \(milesPerGallon) MPG")
.font(.largeTitle)
}
现在编译器错误是
Closure containing a declaration cannot be used with function builder 'ViewBuilder'
有关函数生成器语法的更多信息,请参阅是什么启用了 SwiftUI 的 DSL? https://stackoverflow.com/questions/56434549/what-enables-swiftuis-dsl(其中还有文档的链接)。
最简单的解决方案是避免使用局部变量并直接插入文本:
if showMPGInfo {
Spacer()
Text("Fuel effiency: \(CalcMPG(start: startingMileage, end: endingMileage, fuel: fuelAdded)) MPG")
.font(.largeTitle)
}
其他解决方案是在“立即评估的闭包”中计算文本字段:
if showMPGInfo {
Spacer();
{ () -> Text in
let milesPerGallon = CalcMPG(start: startingMileage,
end: endingMileage,
fuel: fuelAdded)
return Text("Fuel effiency: \(milesPerGallon) MPG")
}()
.font(.largeTitle)
}
或定义辅助功能
func resultField(start: String, end: String, fuel: Double) -> Text {
let milesPerGallon = CalcMPG(start: startingMileage, end: endingMileage, fuel: fuelAdded)
return Text("Fuel effiency: \(milesPerGallon) MPG")
}
并将其用作
if showMPGInfo {
Spacer()
resultField(start: startingMileage, end: endingMileage,
fuel: fuelAdded)
.font(.largeTitle)
}
可能还有其他解决方法,但这就是我到目前为止想到的。