简体   繁体   English

SwiftUI MVVM如何迭代并获取数组的索引

[英]SwiftUI MVVM how to iterate and get index of array

My project is creating an ordering app, and in this screen about the menu detail, there are menu variants which users can choose / add-on, I need to iterate an array of [MenuDetailVariantGroup] and I need to get the index of the array, how do I do this?我的项目正在创建一个订购应用程序,在这个关于菜单详细信息的屏幕中,有用户可以选择/附加的菜单变体,我需要迭代 [MenuDetailVariantGroup] 数组并且我需要获取数组的索引, 我该怎么做呢? While in the for loop I also need to append a variable into a @Published var variantChosen, however if I do self.viewModel.variantChosen.append(1), it always returns an error.在 for 循环中,我还需要将 append 变量转换为 @Published var variantChosen,但是如果我执行 self.viewModel.variantChosen.append(1),它总是返回错误。 Below is my codes:以下是我的代码:

MenuDetailData.swift MenuDetailData.swift

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

MenuDetailVariantGroup.swift MenuDetailVariantGroup.swift

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

MenuDetailVariant.swift MenuDetailVariant.swift

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

MenuDetailViewModel.swift MenuDetailViewModel.swift

class MenuDetailViewModel: ObservableObject, MenuDetailService {
    var apiSession: APIService
    @Published var detaildata: MenuDetailData?
    @Published var variantGroup = [MenuDetailVariantGroup]()
    @Published var variantChosen: Array<Int> = []
    
    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)
    }
    
}

MenuDetailView菜单详情查看

struct MenuDetailView: View {
    @ObservedObject var viewModel = MenuDetailViewModel()
    
    var body: some View {
        ForEach(self.viewModel.variantGroup, id: \.self) { vg in
                /*** I Need to get the index of each iteration here, how? ***/
                VStack {
                    HStack {
                        Text(vg.variantGroupName)
                        Text(String(self.viewModel.arrVariantChoosen[0]))
                    }
                    VStack {
                        ForEach(vg.variant, id: \.self) { v in
                            Text(v.variantName)
                        }
                    }
                }
                // I also need to append Int to @Published var variantChosen
                self.viewModel.variantChosen.append(1)
                // This always return error:
                // Type '()' cannot conform to 'View'; only struct/enum/class types can conform to protocols
            }
        }
    }
}

This is the codes that I have tried so far but failed and return empty这是我到目前为止尝试过但失败并返回空的代码

// This returns blank
ForEach(0..<self.viewModel.variantGroup.count) { i in
    Text("\(self.viewModel.variantGroup[i].variantGroupName)")
}

// This too returns blank
ForEach(self.viewModel.variantGroup.indices) { i in
    Text("\(self.viewModel.variantGroup[i].variantGroupName)")
}

Thank you all in advance谢谢大家

You can use enumerated to have both index and element, like您可以使用枚举来同时拥有索引和元素,例如

    var body: some View {
        ForEach(Array(self.viewModel.variantGroup.enumerated()), id: \.1) { index, vg in
                /*** I Need to get the index of each iteration here, how? ***/
                VStack {

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM