[英]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.