如何在Swift中创建对枚举的绑定?

时间:2020-06-14 17:38:36

标签: swift binding swiftui

我无法在SwiftUI视图的主体中创建一个变量作为对枚举的绑定。我收到错误消息:

无法为类型为'Binding '的类型调用初始化程序 类型为'(get:@escaping()-> LifeEvent ?,的参数列表,设置为: @转义()->())'

如果将LifeEvent?的{​​{1}}更改为相同的错误,则报错

LifeEvent

在此失败的声明之后,我还有其他声明可以很好地工作到Int的绑定:

enum LifeEvent: String, PickableEnum, Codable, Hashable { 
    case debutEtude
    case finEtude
    case dependence
    case deces
    case cessationActivite
    case liquidationPension
}

struct TimeSpanEditView: View {
  var body: some View {
     let internalToEvent = Binding<LifeEvent?> ( // I get the error here
            get: { () -> LifeEvent? in
                return LifeEvent.cessationActivite

            },
            set: {
            }
        )

编辑

我不能使用let internalTo = Binding<Int> ( get: { switch self.timeSpan { case .ending (let to, _), .periodic(_ , _ , let to), .spanning(_ , let to): return to default: return Date.now.year } }, set: { switch self.timeSpan { case .ending (_, _): self.timeSpan = .ending(to: $0, toEvent: nil) case .periodic(let from, let period, _): self.timeSpan = .periodic(from: from, period: period, to: $0) case .spanning(let from, _): self.timeSpan = .spanning(from: from, to: $0) default: fatalError("ExpenseTimeSpan : Case out of bound") } } ) ,因为当lifeEvent更改(=>进入集合)并且@State不支持WillSet而绑定确实支持get / set时,我需要执行一些操作并更改模型属性的值

1 个答案:

答案 0 :(得分:0)

作为@Binding的替代方法,您可以在@Published中使用@ObservableObject

class ViewModel: ObservableObject {
    @Published var lifeEvent: LifeEvent? {
        didSet { // or alternatively willSet (depending on the use case)
            // do whatever you need just after the lifeEvent is changed
        }
    }
}
struct TimeSpanEditView: View {
    @ObservedObject private var viewModel = ViewModel()
    ...
}

并像这样访问您的绑定:

self.$viewModel.lifeEvent