【发布时间】:2021-03-23 02:26:50
【问题描述】:
我正在尝试绑定到枚举实例的 rawValue
enum Brand: Int, CaseIterable, Codable {
case toyota = 0
case mazda
case suzuki
}
struct Car {
var brand: Brand
}
struct CarView: View {
@Binding car: Car
var body: some View {
SomeView(selectionInt: $car.brand)
}
}
但我收到此错误:
无法将“绑定”类型的值转换为预期参数 输入“绑定”。
如果尝试使用 $car.brand.rawValue 代替(在 SomeView 的参数中),但我收到此错误:
无法分配给属性:“rawValue”是不可变的。
如何将我的视图绑定到模型实例的 rawValue?
【问题讨论】:
-
让您的 Car 严格成为 ObservableObject 类并让品牌发布。您将为自己省去解决方法的所有麻烦。 Binding是双向连接,它需要一个可以存储并且可以被Observed的父级。
-
@lorem-ipsum 要使 Car 结构成为 ObservableObject,我必须将其转换为类。在我的实际代码中,我根本不处理汽车,在这个例子中我用汽车表示的模型实际上是一个符合 Codable 的结构,它是另一个或两个 Codable 结构的子结构。以汽车类比为例,当我访问汽车品牌时,它实际上是 Vehicle 模型的成员... vehicle.groundVehicle.car.brand。 “Vehicle”是从 XML 文件中解码出来的,如果我偏离当前设置太远,恐怕我可能会搞砸我目前设置的所有内容。
-
没问题我想我会建议它。您始终可以使用
class手动符合Codable。当您可能在struct中处理许多var时,答案中的解决方法似乎很多工作,下面的解决方法只是每次都创建一个新的Car。您不妨将整个Car与@State作为父级和@Binding作为子级传递,并为自己避免错误的可能性(由多个变量引起)。其余的现有变量会发生什么?像一个新的车牌号码?孩子手头没有原始资料 -
是的。我觉得我需要一种新的方法。与其尝试将 selectionInt 绑定到 Car.brand,不如将其保留为简单的 @State var selectionInt: Int 然后通过函数调用设置汽车实例的品牌?通过与 SomeView() 寻呼机绑定的某种 onChange 调用?
-
如果你使用
@State(在View中)或@Published在ObservableObjectclass中,你只能有效地绑定到单个变量。