有没有一种方法可以在SwiftUI中的特定索引处创建枚举中计算数组属性的绑定



我正在使用枚举在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
}

最新更新