我正在使用枚举在viewModel中建模视图状态。。。
enum ViewState<T> {
case idle
case error(Error)
case loading
case data([T])
我有一个计算属性来获取数据
var data: [T] {
guard case let .data(data) = self else {
return []
}
return data
}
在我的一个视图中,我遍历数据
var dropdownListView: some View {
ForEach(viewModel.state.data.indices, id: .self) { index in
DropdownView(
viewModel: $viewModel.state.data[index],
isActionSheetPresented: $viewModel.isActionSheetPresented
)
}.eraseToAnyView()
}
我得到了一个错误,因为你不能从计算属性中创建绑定,所以创建我自己的自定义绑定。。。
ForEach(viewModel.state.data.indicies, id: .self) { index in
DropdownView(viewModel: Binding<ItemViewModel>(
get: {return viewModel.state.data[index] },
set: { value in
var data = viewModel.state.data
data[index] = value
viewModel.state = .data(data)
},
isActionSheetPresented: $viewModel.isActionSheetPresented
)
}
这是有效的,但在绑定设置器中再次设置整个状态是否有任何问题(我相信SwiftUI足够智能,这样做会很有效(,或者这里有其他方法吗?
在我的设想中,您混合了状态和数据,这是不同的东西。因此,我建议使用类似.loaded
(即状态(的.data([T])
,并通过独立的@Published var data: [T]
属性保留数据。如果进行了调整,您的代码将看起来更加自然。
像
ForEach(viewModel.data.indices, id: .self) { index in
DropdownView(
viewModel: $viewModel.data[index],
isActionSheetPresented: $viewModel.isActionSheetPresented
)
}//.eraseToAnyView() // << you don't need this
}