首页 > 解决方案 > 如何在 Swift 中创建与枚举的绑定?

问题描述

我未能在 SwiftUI 视图的主体中创建一个变量作为与枚举的绑定。我得到错误:

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

如果我更改LifeEvent?LifeEvent

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: {
            }
        )

在这个失败的声明之后,我有其他声明作为 Bindings to Int 完美地工作:

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")
        }
    }
)

编辑

我不能使用@State,因为当 lifeEvent 更改(=> 进入集合)并且 @State 不支持 WillSet 而 Bindings 支持 get/set 时,我需要采取一些操作并更改模型属性的值。

标签: swiftbindingswiftui

解决方案


作为替代方案,@Binding您可以使用@Publishedin @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

推荐阅读