Enums 如何使用枚举在SwiftUI中绑定数据?

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

枚举品牌:Int、caseetable、Codable{ 案例1=0 凯斯马自达 铃木案例 } 结构车{ var品牌:品牌 } 结构视图:视图{ @装订车 var body:一些观点{ SomeView(选择项:$car.brand) } } 但我得到了这个错误:

无法将“Binding”类型的值转换为预期参数 键入“Binding”

如果您尝试改用$car.brand.rawValue(在SomeView的参数中),但出现以下错误:

无法分配给属性:“rawValue”是不可变的


如何将视图绑定到模型实例的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)
        }
    }
}