【问题标题】:SwiftUI MVVM how to loop through data and store them inside arraySwiftUI MVVM如何循环数据并将它们存储在数组中
【发布时间】:2021-04-23 13:23:02
【问题描述】:

我在我的 SwiftUI 项目中使用 MVVM,在我请求从 API 获取数据后,我想遍历数据并将其中一些数据存储在一个数组中,但是它返回错误,正确的方法是什么这个?

这是我的代码和数据结构

菜单详细视图

struct MenuDetailView: View {
    @ObservedObject var viewModel = MenuDetailViewModel()
    
    var body: some View {
        ForEach(self.viewModel.variantGroup, id: \.self) { vg in
                /*** I Need to loop and store vg.variantGroupName into array viewModel.variantChosen, how? ***/

                self.viewModel.variantChosen.append(vg.VariantGroupName)
                // This always return error:
                // Type '()' cannot conform to 'View'; only struct/enum/class types can conform to protocols

                VStack {
                    HStack {
                        Text(vg.variantGroupName)
                        Text(String(self.viewModel.arrVariantChoosen[0]))
                    }
                    VStack {
                        ForEach(vg.variant, id: \.self) { v in
                            Text(v.variantName)
                        }
                    }
                }
                
            }
        }
    }
}

MenuDetailViewModel.swift

class MenuDetailViewModel: ObservableObject, MenuDetailService {
    var apiSession: APIService
    @Published var detaildata: MenuDetailData?
    @Published var variantGroup = [MenuDetailVariantGroup]()
    @Published var variantChosen: Array<String> = []
    
    var cancellables = Set<AnyCancellable>()
    
    init(apiSession: APIService = APISession()) {
        self.apiSession = apiSession
    }
    
    func getMenuDetail() {
        let cancellable = self.getMenuDetail()
            .sink(receiveCompletion: { result in
                switch result {
                case .failure(let error):
                    print("Handle error: \(error)")
                case .finished:
                    break
                }
                
            }) { (detail) in
                self.detaildata = detail.data
                self.variantGroup = detail.data.variantGroup
        }
        cancellables.insert(cancellable)
    }
    
}

MenuDetailData.swift

struct MenuDetailData: Codable, Identifiable {
    let id = UUID()
    let idMenu: String
    let menuName: String
    let variantGroup: [MenuDetailVariantGroup]
}

MenuDetailVariantGroup.swift

struct MenuDetailVariantGroup: Codable, Identifiable, Hashable {
    let id = UUID()
    let variantGroupName: String
    let variant: [MenuDetailVariant]
    let limit: Int
}

MenuDetailVariant.swift

struct MenuDetailVariant: Codable, Identifiable, Hashable {
    let id = UUID()
    let variantName: String
}

提前谢谢大家

【问题讨论】:

    标签: arrays swift swiftui swift5


    【解决方案1】:

    您不能在ForEach 中添加它。在 SwiftUI 中,ForEach 是一个视图。它接受视图数据,它与Array.forEach 不同。 您需要在视图模型中执行此操作。像这样

    func getMenuDetail() {
            let cancellable = self.getMenuDetail()
                .sink(receiveCompletion: { result in
                    switch result {
                    case .failure(let error):
                        print("Handle error: \(error)")
                    case .finished:
                        break
                    }
                    
                }) { (detail) in
                    self.detaildata = detail.data
                    self.variantGroup = detail.data.variantGroup
                    self.variantChosen = self.variantGroup.map{$0.variantGroupName} //<--here
            }
            cancellables.insert(cancellable)
        }
    

    ForEach中删除它

     self.viewModel.variantChosen.append(vg.VariantGroupName)
    

    【讨论】:

    • 非常感谢先生!就是这样,对不起,我对 swift 很陌生,您能否详细说明一下 $0 是什么意思?以及如何与嵌套的孩子映射?或者是否有任何阅读参考?
    • 参考这个:medium.com/@Dougly/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多