有没有一种方法可以在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足够智能,这样会很有效),或者在这里还有另一种方法吗?

解决方法

在我看来,您将状态和数据混合在一起,这是不同的事情。因此,我会推荐.data([T])之类的东西来代替.loaded(即状态),并通过独立的@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
    }