在 SwiftUI 中使用状态变量作为函数的输入
Using state variables as inputs to a func in SwiftUI
我有两个文本字段可以更改两个@State 变量的值,即 startingMileage 和 endingMileage,还有一个步进器可以更改第三个名为 fuelAdded 的 @State 变量的值。我正在尝试使用用户的输入并进行计算以计算每加仑英里数。在操场上,我的代码按预期工作。但是,它在 SwiftUI 项目中不起作用。
尝试 运行 playground 中的代码如下:
func CalcMPG(start: String, end: String, fuel: Double) -> Int {
let start = Int(start) ?? 1
let end = Int(end) ?? 1
let fuel = Int(fuel)
let mpg = (end-start) / fuel
return mpg
}
var endingMileage:String = "9250"
var startingMileage:String = "9000"
var fuelAdded:Double = 20
let milesPerGallon = CalcMPG(start: startingMileage, end: endingMileage, fuel: fuelAdded)
print("Fuel Efficiency: \(milesPerGallon) mpg")
这按预期工作。
struct ContentView : View {
@State var startingMileage: String = ""
@State var endingMileage: String = ""
@State var fuelAdded: Double = 10
@State var carModel: String = ""
@State var showMPGInfo = false
@State var milesPerGallon: Int = 10
func CalcMPG(start: String, end: String, fuel: Double) -> Int {
let start = Int(start) ?? 1
let end = Int(end) ?? 1
let fuel = Int(fuel)
let mpg = (end-start) / fuel
return mpg
}
var body: some View {
NavigationView {
VStack{
HStack {
Text("Car Model:")
Spacer()
TextField($carModel, placeholder: Text("Toyota Corolla"))
.textFieldStyle(.roundedBorder)
}
HStack {
Text("Starting ODO:")
Spacer()
TextField($startingMileage, placeholder: Text("8000"))
.textFieldStyle(.roundedBorder)
Text("miles")
}
HStack {
Text("Ending ODO:")
Spacer()
TextField($endingMileage, placeholder: Text("9000"))
.textFieldStyle(.roundedBorder)
Text("miles")
}
HStack {
Stepper(value: $fuelAdded, in: 0...20, step: 0.5) {
Text("Fuel Added: \(fuelAdded, specifier: "%0.1f") gallons")
}
}
Button(action: {
self.showMPGInfo.toggle() }){
Text("Show/Hide MPG")
}
if showMPGInfo {
Spacer()
milesPerGallon = CalcMPG(start: startingMileage, end: endingMileage, fuel: fuelAdded)
Text("Fuel effiency: \(milesPerGallon) MPG")
.font(.largeTitle)
}
}.padding()
.navigationBarTitle(Text("Gas Mileage Calculator"))
}
}
}
当用户点击 "Show/Hide MPG" 时。我希望最终结果文本为 "Fuel Efficiency: xx MPG"
但是,我收到以下错误:
ContentView.swift:34:19: 无法推断复杂闭包 return 类型;添加显式类型以消除歧义
它对我来说没有任何意义...它突出显示了 NavigationView 中的起始 VStack。
有什么想法吗?
问题是对 milesPerGallon
的赋值不能很好地与用于构建视图层次结构参数的“函数构建器语法”一起使用。如果我们将@State var milesPerGallon
替换为一个局部变量(即是,它不携带视图所依赖的状态,只是一个中间值),它会变得更加明显:
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'
有关函数构建器语法的更多信息,请参阅 (其中还包含指向文档的链接)。
最简单的解决方案是避免局部变量并直接插入文本:
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)
}
可能还有其他解决方法,但这是我目前想到的。
我有两个文本字段可以更改两个@State 变量的值,即 startingMileage 和 endingMileage,还有一个步进器可以更改第三个名为 fuelAdded 的 @State 变量的值。我正在尝试使用用户的输入并进行计算以计算每加仑英里数。在操场上,我的代码按预期工作。但是,它在 SwiftUI 项目中不起作用。
尝试 运行 playground 中的代码如下:
func CalcMPG(start: String, end: String, fuel: Double) -> Int {
let start = Int(start) ?? 1
let end = Int(end) ?? 1
let fuel = Int(fuel)
let mpg = (end-start) / fuel
return mpg
}
var endingMileage:String = "9250"
var startingMileage:String = "9000"
var fuelAdded:Double = 20
let milesPerGallon = CalcMPG(start: startingMileage, end: endingMileage, fuel: fuelAdded)
print("Fuel Efficiency: \(milesPerGallon) mpg")
这按预期工作。
struct ContentView : View {
@State var startingMileage: String = ""
@State var endingMileage: String = ""
@State var fuelAdded: Double = 10
@State var carModel: String = ""
@State var showMPGInfo = false
@State var milesPerGallon: Int = 10
func CalcMPG(start: String, end: String, fuel: Double) -> Int {
let start = Int(start) ?? 1
let end = Int(end) ?? 1
let fuel = Int(fuel)
let mpg = (end-start) / fuel
return mpg
}
var body: some View {
NavigationView {
VStack{
HStack {
Text("Car Model:")
Spacer()
TextField($carModel, placeholder: Text("Toyota Corolla"))
.textFieldStyle(.roundedBorder)
}
HStack {
Text("Starting ODO:")
Spacer()
TextField($startingMileage, placeholder: Text("8000"))
.textFieldStyle(.roundedBorder)
Text("miles")
}
HStack {
Text("Ending ODO:")
Spacer()
TextField($endingMileage, placeholder: Text("9000"))
.textFieldStyle(.roundedBorder)
Text("miles")
}
HStack {
Stepper(value: $fuelAdded, in: 0...20, step: 0.5) {
Text("Fuel Added: \(fuelAdded, specifier: "%0.1f") gallons")
}
}
Button(action: {
self.showMPGInfo.toggle() }){
Text("Show/Hide MPG")
}
if showMPGInfo {
Spacer()
milesPerGallon = CalcMPG(start: startingMileage, end: endingMileage, fuel: fuelAdded)
Text("Fuel effiency: \(milesPerGallon) MPG")
.font(.largeTitle)
}
}.padding()
.navigationBarTitle(Text("Gas Mileage Calculator"))
}
}
}
当用户点击 "Show/Hide MPG" 时。我希望最终结果文本为 "Fuel Efficiency: xx MPG"
但是,我收到以下错误:
ContentView.swift:34:19: 无法推断复杂闭包 return 类型;添加显式类型以消除歧义
它对我来说没有任何意义...它突出显示了 NavigationView 中的起始 VStack。
有什么想法吗?
问题是对 milesPerGallon
的赋值不能很好地与用于构建视图层次结构参数的“函数构建器语法”一起使用。如果我们将@State var milesPerGallon
替换为一个局部变量(即是,它不携带视图所依赖的状态,只是一个中间值),它会变得更加明显:
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'
有关函数构建器语法的更多信息,请参阅
最简单的解决方案是避免局部变量并直接插入文本:
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)
}
可能还有其他解决方法,但这是我目前想到的。