SwiftUI MVVM 如何迭代和获取数组的索引
SwiftUI MVVM how to iterate and get index of array
我的项目正在创建一个订购应用程序,在这个关于菜单细节的屏幕中,有用户可以选择/附加的菜单变体,我需要迭代一个 [MenuDetailVariantGroup] 数组,我需要得到数组的索引,我该怎么做?在 for 循环中,我还需要将一个变量附加到 @Published var variantChosen 中,但是如果我这样做 self.viewModel.variantChosen.append(1),它总是 return 是一个错误。以下是我的代码:
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
}
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
}
}
}
}
这是我迄今为止尝试过但失败的代码,return 为空
// 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)")
}
提前谢谢大家
您可以使用枚举来同时拥有索引和元素,例如
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 {
我的项目正在创建一个订购应用程序,在这个关于菜单细节的屏幕中,有用户可以选择/附加的菜单变体,我需要迭代一个 [MenuDetailVariantGroup] 数组,我需要得到数组的索引,我该怎么做?在 for 循环中,我还需要将一个变量附加到 @Published var variantChosen 中,但是如果我这样做 self.viewModel.variantChosen.append(1),它总是 return 是一个错误。以下是我的代码:
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
}
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
}
}
}
}
这是我迄今为止尝试过但失败的代码,return 为空
// 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)")
}
提前谢谢大家
您可以使用枚举来同时拥有索引和元素,例如
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 {