Моя цель — создать такой список в SwiftUI

Каждый раз, когда пользователь нажимает кнопку «Добавить», создается новая строка, а затем при проведении пальцем по экрану для удаления соответствующую строку необходимо удалить.
Чтобы сделать это, я начинаю с очень простой модели
struct SnagItem: Codable { частная (установленная) ссылка на переменную: Int = 0 сведения о частной (установленной) переменной: String = "" частный (набор) вар isCompleted: Bool = false перечисление CodingKeys: String, CodingKey, CaseIterable { ссылка на регистр = "Ссылка" детали дела = "Подробности" случай isCompleted = "Завершено" } } расширение SnagItem: Hashable { } Я использую эту модель в модели представления, которую хочу привязать к своему представлению SwiftUI. Это модель представления:
класс SnagItemViewModel: ObservableObject { частный пусть snagItem: SnagItem @Опубликованная информация о переменной: String = "" @Published var isCompleted: Bool = false init (withSnagItem snagItem: SnagItem) { self.snagItem = snagItem подробности = snagItem.details isCompleted = snagItem.isCompleted } } У меня есть другая модель представления, которая отслеживает все элементы (строки) с помощью массива. Это также обрабатывает добавление и удаление элементов.
класс SnagItemsViewModel: ObservableObject { @Published var snagItems: [SnagItemViewModel] = [SnagItemViewModel(withSnagItem: SnagItem())] func getSnagItem(по индексу: Int) -> SnagItemViewModel { snagItems[индекс] } функция addSnagItem() { snagItems.append(SnagItemViewModel(withSnagItem: SnagItem())) } func deleteSnagItemRecord (в indexSet: IndexSet) { Guard let index = indexSet.first else { return } snagItems.remove(at: index) } } @Published var snagItems: [SnagItemViewModel] = [SnagItemViewModel(withSnagItem: SnagItem())] Я создал представление SwiftUI, которое действует как контейнер:
struct SnagItemsView: Просмотр { @StateObject вар snagItemsViewModel: SnagItemsViewModel var body: some View { ForEach(0 ..< snagItemsViewModel.snagItems.count, id: \.self) { snagItemIndex в let snagItemViewModel = snagItemsViewModel.getSnagItem(at: snagItemIndex) SnagItemRowView (ссылка: snagItemIndex + 1, snagItemViewModel: snagItemViewModel) } .onDelete(выполнить: удалить(в:)) } func delete (в indexSet: IndexSet) { сАнимацией { snagItemsViewModel.deleteSnagItemRecord (в: indexSet) } } } Каждая строка имеет свое собственное представление:
struct SnagItemRowView: Просмотр { @State ссылка на переменную: Int @StateObject вар snagItemViewModel: SnagItemViewModel пусть GridItemColumnConfig = [ GridItem(.fixed(Constants.Frame.minGridItemWidth)), GridItem(.flexible()), GridItem(.fixed(Constants.Frame.minGridItemWidth)) ] var body: some View { LazyVGrid (столбцы: GridItemColumnConfig, интервал: 8) { ForEach(0 ..< SnagItem.CodingKeys.allCases.count, id: \.self) {columnIndex в let snagItemCategory = SnagItem.CodingKeys.allCases[columnIndex] если snagItemCategory == .reference { Текст("\(ссылка)") } иначе, если snagItemCategory == .details { TextField(snagItemViewModel.localizedText(for: .enterValue), текст: $snagItemViewModel.details, ось: .вертикальная) } еще { Toggle("", isOn: $snagItemViewModel.isCompleted) .labelsHidden() } } } } } По большей части все работает нормально.
Все начинается так:

Когда пользователь нажимает «Добавить», добавляется еще одна строка, а повторение этого действия несколько раз приводит к добавлению новых строк:

Проблемы начинаются, когда я пытаюсь удалить:

Как вы можете видеть, я пытаюсь удалить строку 3, после удаления вместо этого удаляется строка 4, по крайней мере, с точки зрения пользовательского интерфейса:

Я распечатал значения из моей функции get, и кажется, что модель представления на самом деле имеет правильные объекты, однако представление SwiftUI, похоже, не отображает правильные данные по какой-то причине:

Я добавил точку останова в свою функцию удаления, чтобы проверить, правильный ли индекс передается, и кажется, что здесь все выглядит хорошо:

Наконец, когда я пытаюсь добавить еще одну строку после процесса удаления, кажется, что старые данные добавляются снова:

И снова, когда я проверяю модель представления, данные кажутся правильными, но представление SwiftUI показывает что-то другое.
Что я делаю не так и как это исправить?
Мобильная версия