Enums 如何使用SwiftUI中的滑块更改以枚举为类型的变量?

Enums 如何使用SwiftUI中的滑块更改以枚举为类型的变量?,enums,swiftui,slider,Enums,Swiftui,Slider,我在模型MyModel中有一个变量myValue。在本例中,我希望myValue仅为4个值中的一个(现实生活中为50个值,以防影响答案)。假设我希望myValue是这个数组中的一个值:让myArray=[4,2,7,5] 我想一个滑块能够改变我的价值。但是,滑块仅接受Double作为类型 我正在努力解决这个问题,但到目前为止,我只提出了一个有点复杂的解决方案 //类型 枚举MyType:Int,CaseIterable,Codable{ 案例0=4 案例一=2 案例二=7 案例三=5 var a

我在模型
MyModel
中有一个变量
myValue
。在本例中,我希望
myValue
仅为4个值中的一个(现实生活中为50个值,以防影响答案)。假设我希望myValue是这个数组中的一个值:
让myArray=[4,2,7,5]

我想一个滑块能够改变我的价值。但是,滑块仅接受Double作为类型

我正在努力解决这个问题,但到目前为止,我只提出了一个有点复杂的解决方案

//类型
枚举MyType:Int,CaseIterable,Codable{
案例0=4
案例一=2
案例二=7
案例三=5
var asIndex:双{
切换自身{
case.zero:返回0
案例一:返回1
案例二:返回2
案例三:返回3
}
}
}
//模型
结构MyModel:可编码{
变量myValue:MyType=.zero
}
//观点
结构MyView:View{
@绑定var-myModel:myModel
var body:一些观点{
滑块(值:Binding.init)(
get:{()->Double返回myModel.myValue.asIndex},
集合:{newValue in
如果让unwrappedMyType=MyType(rawValue:Int(newValue)){myModel=myModel(myValue:unwrappedMyType)}
),在:0…3)
Text(\(myModel.myValue.rawValue)“作为字符串)//4、2、7或5,具体取决于滑块设置为值0、1、2或3
}
}
结构ContentView:View{
@状态变量myModel:myModel=myModel()
var body:一些观点{
MyView(myModel:$myModel)
.框架(宽度:300,高度:100)
}
}

它几乎可以工作了,但滑块无法设置。我做错了什么?有更简单或更好的方法吗?

默认情况下,
滑块的范围是连续的,所以映射到enum的重要部分是给它一个步骤

这是可能的解决办法。使用Xcode 12.4/iOS 14.4进行测试

以下仅为修改后的零件:

enum MyType: Int, CaseIterable, Codable {
    case zero = 4
    case one = 2
    case two = 7
    case three = 5

    init(index: Double = 0) {
        if let type = Self.allCases.first(where: { $0.asIndex == index }) {
            self = type
        } else {
            self = .zero
        }
    }

    var asIndex : Double {
        switch self {
        case .zero: return 0
        case .one: return 1
        case .two: return 2
        case .three: return 3
        }
    }
}

// VIEWS
struct MyView: View {
    @Binding var myModel: MyModel

    var body: some View {

        Slider(value: Binding(
            get: { myModel.myValue.asIndex },
            set: { myModel.myValue = MyType(index: $0) }
        ), in: 0...3, step: 1)                             // give step !!

        Text("\(myModel.myValue.rawValue)" as String) // 4, 2, 7 or 5 depending on the slider being set to values 0,1,2 or 3
    }
}

如果我的自定义滑块没有步骤,有没有简单的破解方法?或者我真的应该在滑块中实现一个步进机制吗?