Я использую цикл ForEach для отображения данных в поле зрения. ForEach возвращает неизменяемое состояние, но теперь мне нужно обновить свойства представления, например обновить количество корзины покупок. Это представление корзины покупок, в котором я использую пошаговое обновление представления, например увеличение и уменьшение представления формы товара. Но у меня есть ошибка: Левая часть оператора мутации не изменяема: 'item' - это константа 'let'. Я понял, почему это происходит из-за ForEach. Какова альтернатива исправлению этой ошибки?
Ошибка в этой строке..
Степпер { Text("\(Image(systemName: "multiply"))\(item.quantity)") } onIncrement: { item.quantity += 1 // ошибка в этой строке } onDecrement: { если элемент.количество > 1 { элемент.количество -= 1 } } Вот мой json.
импортировать фундамент // МАРК: - Добро пожаловать struct ProductData: Codable, Hashable { пусть тележки: [Корзина] } // ОТМЕТКА: - Корзина struct Cart: Codable, Hashable { пусть идентификатор: Int пусть продукты: [Продукт] } // ОТМЕТКА: - Продукт struct Product: кодируемый, хэшируемый, идентифицируемый { пусть идентификатор: Int пусть заголовок: Строка var цена, количество, всего: Int пусть скидкаПроцент: двойной пусть со скидкойЦена: Int пусть миниатюра: строка } Вот класс заказа..
импортировать SwiftUI Порядок класса: ObservableObject { @Published var продукты = [Продукт]() @Published Private(set) var ProductTotal: Int = 0 func add(пункт: Продукт) { if let index = Products.firstIndex(where: {$0.id == item.id }) { продукты[индекс].количество += 1 } еще { продукты.append(пункт) } } } Вот вид «Порядок»..
импортировать SwiftUI структура OrderView: Просмотр { @EnvironmentObject var order: Порядок var body: some View { Навигационный стек { Список { Раздел { ForEach(order.products) { элемент в Раздел { HStack { Текст("Описание") .foregroundColor(.blue) .смелый() Разделитель() Текст("Действие") .foregroundColor(.blue) .смелый() } } HStack { if let url = URL(строка: item.thumbnail) { ProductAsyncImageView (url: URL) .frame(ширина: 90, высота: 90) .padding(.bottom, -10) .clipShape(Круг()) } Разделитель() ВСтек { HStack { Степпер { Text("\(Image(systemName: "multiply"))\(item.quantity)") } onIncrement: { элемент.количество += 1 } onDecrement: { если элемент.количество > 1 { элемент.количество -= 1 } } Изображение (имя системы: «мусор») .foregroundColor(Цвет (оттенок: 1,0, насыщенность: 0,89, яркость: 0,835)) .onTapGesture { order.remove(предмет: предмет) } } } Разделитель() } ВСтек { HStack(интервал: 20) { Text("Имя: \(item.title)") .font(.subheadline) .frame(maxWidth: .infinity, выравнивание: .leading) .смелый() } HStack { Text("Цена: £\(item.price)") .font(.subheadline) .смелый() .frame(maxWidth: .infinity, выравнивание: .leading) Text("Промежуточный итог: £\(item.quantity * item.price)") .font(.subheadline) .смелый() .frame(maxWidth: .infinity, выравнивание: .leading) } } } } Раздел { NavigationLink("Разместить заказ") { } } } .navigationTitle("Заказ") } } } Вот ошибка скриншота..

Мобильная версия