Enums 如何使用枚举在SwiftUI中绑定数据?
我正在尝试绑定到枚举实例的rawValue 枚举品牌:Int、caseetable、Codable{ 案例1=0 凯斯马自达 铃木案例 } 结构车{ var品牌:品牌 } 结构视图:视图{ @装订车 var body:一些观点{ SomeView(选择项:$car.brand) } } 但我得到了这个错误: 无法将“Binding”类型的值转换为预期参数 键入“Binding” 如果您尝试改用$car.brand.rawValue(在SomeView的参数中),但出现以下错误: 无法分配给属性:“rawValue”是不可变的Enums 如何使用枚举在SwiftUI中绑定数据?,enums,swiftui,Enums,Swiftui,我正在尝试绑定到枚举实例的rawValue 枚举品牌:Int、caseetable、Codable{ 案例1=0 凯斯马自达 铃木案例 } 结构车{ var品牌:品牌 } 结构视图:视图{ @装订车 var body:一些观点{ SomeView(选择项:$car.brand) } } 但我得到了这个错误: 无法将“Binding”类型的值转换为预期参数 键入“Binding” 如果您尝试改用$car.brand.rawValue(在SomeView的参数中),但出现以下错误: 无法分配给属性
如何将视图绑定到模型实例的rawValue?对于这种绑定,您需要自定义绑定来帮助SwiftUI绑定数据 信息:无法更改枚举的原始值,因为它们是不可变的强> 而且尝试用绑定的方式改变它们也不会对你有帮助,它们是不可变的您可以获取它们,而不是设置它们强> 所以,有了这些信息,你就可以知道为什么SwiftUI不想一开始就绑定它了!因为如果SwiftUI使绑定成为可能,那将是对枚举值的严重违反!然后,我们将尝试以这种方式使用绑定能力,即更改car而不是Enum的Int。例如,请参见代码
对于这种绑定,您需要一个自定义绑定来帮助SwiftUI绑定数据 信息:无法更改枚举的原始值,因为它们是不可变的强> 而且尝试用绑定的方式改变它们也不会对你有帮助,它们是不可变的您可以获取它们,而不是设置它们强> 所以,有了这些信息,你就可以知道为什么SwiftUI不想一开始就绑定它了!因为如果SwiftUI使绑定成为可能,那将是对枚举值的严重违反!然后,我们将尝试以这种方式使用绑定能力,即更改car而不是Enum的Int。例如,请参见代码
使用
brandProxy
维护其他Car
变量的完整性
import SwiftUI
enum Brand: Int, CaseIterable, Codable {
case toyota = 0
case mazda
case suzuki
case unknown
func description() -> String {
var result = "unknown"
switch self {
case .toyota:
result = "toyota"
case .mazda:
result = "mazda"
case .suzuki:
result = "suzuki"
case .unknown:
result = "unknown"
}
return result
}
}
struct CarView: View {
//This makes it mutable
@State var car: Car
var brandProxy: Binding<Int> {
Binding<Int>(
get: {
car.brand.rawValue
},
set: {
car.brand = Brand(rawValue: $0) ?? Brand.unknown
}
)
}
var body: some View {
VStack{
Text(car.brand.description())
SomeView(selectedIndex: brandProxy)
}
}
}
导入快捷界面
枚举品牌:Int、caseetable、Codable{
案例1=0
凯斯马自达
铃木案例
案件不详
func description()->字符串{
var result=“未知”
切换自身{
案例.丰田:
结果=“丰田”
案例.马自达:
结果=“马自达”
案例.铃木:
结果=“铃木”
案件.未知:
结果=“未知”
}
返回结果
}
}
结构视图:视图{
//这使得它是可变的
@状态变量汽车:汽车
var代理:绑定{
装订(
获取:{
汽车、品牌、价值
},
设置:{
car.brand=品牌(原始价值:$0)??品牌未知
}
)
}
var body:一些观点{
VStack{
文本(car.brand.description())
SomeView(selectedIndex:brandProxy)
}
}
}
使用品牌代理
维护其他汽车
变量的完整性
import SwiftUI
enum Brand: Int, CaseIterable, Codable {
case toyota = 0
case mazda
case suzuki
case unknown
func description() -> String {
var result = "unknown"
switch self {
case .toyota:
result = "toyota"
case .mazda:
result = "mazda"
case .suzuki:
result = "suzuki"
case .unknown:
result = "unknown"
}
return result
}
}
struct CarView: View {
//This makes it mutable
@State var car: Car
var brandProxy: Binding<Int> {
Binding<Int>(
get: {
car.brand.rawValue
},
set: {
car.brand = Brand(rawValue: $0) ?? Brand.unknown
}
)
}
var body: some View {
VStack{
Text(car.brand.description())
SomeView(selectedIndex: brandProxy)
}
}
}
导入快捷界面
枚举品牌:Int、caseetable、Codable{
案例1=0
凯斯马自达
铃木案例
案件不详
func description()->字符串{
var result=“未知”
切换自身{
案例.丰田:
结果=“丰田”
案例.马自达:
结果=“马自达”
案例.铃木:
结果=“铃木”
案件.未知:
结果=“未知”
}
返回结果
}
}
结构视图:视图{
//这使得它是可变的
@状态变量汽车:汽车
var代理:绑定{
装订(
获取:{
汽车、品牌、价值
},
设置:{
car.brand=品牌(原始价值:$0)??品牌未知
}
)
}
var body:一些观点{
VStack{
文本(car.brand.description())
SomeView(selectedIndex:brandProxy)
}
}
}
用我的代码尝试一下,它几乎按照我的预期工作。SomeView根据汽车品牌正确显示相关图像。但是SomeView实际上是一种选择器/寻呼机。当我转到另一个品牌时,它似乎正在获得但没有设置品牌。那么我该如何使用它,使其成为一个双向绑定。@里贝纳:那么新的问题与您提出的问题无关,因为我们知道这个问题是关于在SwiftUI中绑定到枚举的rawValue的,我想我用工作示例解释了它。您要问的新问题可能与代码调试有关,我认为最好在单独的问题中提问。使用代码和视图可以使该问题发生。谢谢,很公平。我应该根据我试图实现的目标来确定最初的问题。谢谢你更新的答案。@Ribena:我刚刚更新了自定义绑定,这样你也可以更改汽车,并在代码中进行一些清理。干杯。你的答案是有效的,但最终我将把被接受的答案改为lorem ipsum的,因为它更好地回答了我问题的精神。不过,下次我会尽量说得更清楚,因为我同意我在问题标题和正文中没有问同样的问题。用我的代码尝试一下,它的工作原理几乎和我预期的一样。SomeView根据汽车品牌正确显示相关图像。但是SomeView实际上是一种选择器/寻呼机。当我转到另一个品牌时,它似乎正在获得但没有设置品牌。那么我该如何使用它,使其成为一个双向绑定。@里贝纳:那么新的问题与您提出的问题无关,因为我们知道这个问题是关于在SwiftUI中绑定到枚举的rawValue的,我想我用工作示例解释了它。您要问的新问题可能与代码调试有关,我认为最好在单独的问题中提问。使用代码
enum Brand: Int, CaseIterable, Codable, CustomStringConvertible {
case toyota = 0
case mazda = 1
case suzuki = 2
var description: String {
switch self {
case .toyota: return "toyota"
case .mazda: return "mazda"
case .suzuki: return "suzuki"
}
}
}
struct Car {
var brand: Brand
}
import SwiftUI
enum Brand: Int, CaseIterable, Codable {
case toyota = 0
case mazda
case suzuki
case unknown
func description() -> String {
var result = "unknown"
switch self {
case .toyota:
result = "toyota"
case .mazda:
result = "mazda"
case .suzuki:
result = "suzuki"
case .unknown:
result = "unknown"
}
return result
}
}
struct CarView: View {
//This makes it mutable
@State var car: Car
var brandProxy: Binding<Int> {
Binding<Int>(
get: {
car.brand.rawValue
},
set: {
car.brand = Brand(rawValue: $0) ?? Brand.unknown
}
)
}
var body: some View {
VStack{
Text(car.brand.description())
SomeView(selectedIndex: brandProxy)
}
}
}