gpt4 book ai didi

swift - 可选择在 SwiftUI 文本字段中链接绑定(bind)值

转载 作者:行者123 更新时间:2023-12-02 01:53:48 26 4
gpt4 key购买 nike

我有以下模型:

struct Food: Codable, Identifiable {
var id = UUID()
var name: String = ""
var energy: Float?
var water: Float?
var macroProfile: MacronutrientProfile?
}

struct MacronutrientProfile: Codable {
var carb: Float?
var protein: Float?
var fat: Float?
}

我正在尝试将此模型实例的值绑定(bind)到 TextField 中:

struct FoodEditView: View {
@State var food: Food
var body: some View {
Form {
Section(header: Text("Basics").fontWeight(.bold)) {
HStack {
Text("Name")
Spacer()
TextField("Name", text: $food.name)
.multilineTextAlignment(.trailing)
}
HStack {
Text("Energy")
Spacer()
TextField("Calories", value: $food.energy, formatter: calorie)
.multilineTextAlignment(.trailing)
.keyboardType(.numberPad)
}
HStack {
Text("Water")
Spacer()
TextField("Grams", value: $food.water, formatter: gram)
.multilineTextAlignment(.trailing)
.keyboardType(.numberPad)
}
}
.textCase(.none)
Section(header: Text("Macronutrients").fontWeight(.bold)) {
HStack {
Text("Carbohydrates")
Spacer()
TextField("Grams", value: $food.macroProfile?.carb, formatter: gram)
.multilineTextAlignment(.trailing)
.keyboardType(.numberPad)
}
HStack {
Text("Protein")
Spacer()
TextField("Grams", value: $food.macroProfile?.protein, formatter: gram)
.multilineTextAlignment(.trailing)
.keyboardType(.numberPad)
}
HStack {
Text("Fat")
Spacer()
TextField("Grams", value: $food.macroProfile?.fat, formatter: gram)
.multilineTextAlignment(.trailing)
.keyboardType(.numberPad)
}
}
.textCase(.none)

链接 macroProfile 时,我很奇怪,一长串错误:

XCode Error

我的问题是,当可选链接 macroProfile 而不是使用 energywater 时,我是如何收到这些错误的,两者都是其中哪些也是可选值?解决此问题的最佳方法是什么?

最佳答案

Binding 上使用“点链”语法时它是创建 Binding 的快捷语法.它没有点语法通常具有的相同语义“查找此事物的属性”。

所以 $food.name 不会解决 food 的绑定(bind)然后引用其属性之一。它将创建一个双向 Binding<String>name食物的属性。

同样,当你有 $food.macroProfile该表达式的值为 Binding<MacroNutrientProfile?> ... 将直接更改 food 中的值的绑定(bind)(它可以更改的值是可选的)。它不是绑定(bind)的解析 $food然后引用该对象的属性之一。

$food.macroProfile?.carb是荒谬的,因为 $food.macroProfile类型为 Binding<MacroNutrientProfile?>这不是可选类型。所以你会看到错误。

$food.name不是无意义的,因为它是 Binding<String>并且您不会尝试将非可选值视为可选值。

更改它的一种方法是使用自定义绑定(bind):

struct Food: Codable, Identifiable {
var id = UUID()
var name: String = ""
var energy: Float?
var water: Float?
var macroProfile: MacronutrientProfile?
}

struct MacronutrientProfile: Codable {
var carb: Float?
var protein: Float?
var fat: Float?
}

struct SomeView : View {
@State var food: Food
let gram = NumberFormatter()

var body : some View {
let carbBinding = Binding<Float?>(get: { food.macroProfile?.carb },
set: { newValue in food.macroProfile?.carb = newValue })

return HStack {
Text("Carbohydrates")
Spacer()
TextField("Grams", value: carbBinding, formatter: gram)
.multilineTextAlignment(.trailing)
.keyboardType(.numberPad)
}
}
}

关于swift - 可选择在 SwiftUI 文本字段中链接绑定(bind)值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69861467/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com