swift - 如何在 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 时,我需要采取一些操作并更改模型属性的值。
解决方案
作为替代方案,@Binding
您可以使用@Published
in @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
推荐阅读
- c# - 存储到 oracle 时截断负十进制值
- python - 有没有办法根据现有列的当前和前一行值在每行的新列中分配增量值的数量?
- asp.net-mvc - ASP.net FileHelpers 无法将字符串转换为日期时间
- amazon-web-services - 我不应该使用 Direct Connect 在 AWS 中提供从多个区域收集信息的解决方案吗?
- r - 如何在循环中将变量的名称作为字符串获取?
- javascript - 为什么我的购物车在更改产品状态后没有重新渲染
- php - 如何使用 phpmailer 向收件人发送具有唯一 ID 的取消订阅链接
- mysql - 如何设置这些系统变量以允许谷歌云 mysql 中的表情符号?
- swift - 当我想在 CoreData 中保存某些内容时,Lottie Animation 停止工作
- html - 从粘性元素后面窥视的引导图标