SwiftUI: lista de temporizadores, obteniendo "índice fuera de rango" al eliminar el temporizador de la lista

Tengo muchas dificultades para eliminar un temporizador de una serie de temporizadores que se muestran en una lista.

Tengo un modelo que almacena la información del temporizador. En este ejemplo simplificado, solo está almacenando el tiempo restante.

Tengo un ViewModel que tiene 2 matrices, una que almacena modelos de temporizador y otra que almacena temporizadores. También tiene eliminar temporizador, crear temporizador y agregar funciones de matriz de temporizador en el modelo de vista.

Vista de contenido muestra los temporizadores en una lista, usando ForEach. También tiene una barra de navegación con un botón "Agregar" en la parte superior para ir a otra vista para configurar los temporizadores.

La Vista de temporizadores agregados por el usuario permite a los usuarios seleccionar la cantidad de segundos y luego agregar el temporizador. El botón Agregar agrega los segundos a la matriz de modelo de temporizador y agrega un temporizador a la matriz de temporizador en el modelo de vista.

Todo funciona bien, excepto cuando elimino un temporizador de la lista, obtengo un índice fuera de rango en la función createTimer() del modelo de vista. Sé cuál es el problema... Estoy codificando el índice del temporizador cuando agrego un temporizador a la matriz de temporizadores en la vista Temporizadores agregados por el usuario. Simplemente no tengo idea de cómo arreglarlo. He intentado durante días encontrar una forma de acceder al índice de ForEach y usarlo como índice para cada temporizador en la Matriz de temporizadores... pero no sé si es posible hacer eso.

De todos modos, estoy completamente atascado ... cualquier idea sería muy apreciada.

¡Gracias por adelantado!

Este código a continuación está muy simplificado en comparación con el código real, pero señala el problema.

Modelo:

import Foundation
import SwiftUI

struct TimerModel: Identifiable {
   let id = UUID()
   var timeRemainingSeconds: Int
}

Ver modelo:

import Foundation
import SwiftUI

class TimerViewModel: ObservableObject {

   @Published var timerModelArray = [TimerModel]()
   @Published var timersArray = [Timer]()

   func deleteItem(indexSet: IndexSet) {
       timersArray.remove(atOffsets: indexSet)
       timerModelArray.remove(atOffsets: indexSet)
   }

   func createTimer(timerNumber: Int) -> Timer {
       return Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { timer in
            self.timerModelArray[timerNumber].timeRemainingSeconds -= 1
       }
   }

   func appendTimerArray(timeRemainingSeconds: Int) {
       timerModelArray.append(TimerModel(timeRemainingSeconds: timeRemainingSeconds))
   }
}

Vista de contenido:

import SwiftUI

struct ContentView: View {

@StateObject var viewModel = TimerViewModel()
@State var arrayCount = 0

var body: some View {
    NavigationView {
        VStack {
            List {
                ForEach(viewModel.timerModelArray.indices, id: \.self) { time in
                    Section {
                        Text("\(viewModel.timerModelArray[time].timeRemainingSeconds)")
                    }
                }
                .onDelete { indexSet in
                    viewModel.timersArray[viewModel.timersArray.count - 1].invalidate()
                    viewModel.deleteItem(indexSet: indexSet)
                }
            }
        }
        .background(.ultraThinMaterial)
        .listStyle(InsetGroupedListStyle())
        .navigationBarItems(trailing: NavigationLink("Add", destination: UserAddedTimer()))
    }
    .environmentObject(viewModel)
}
}

UserAddedTimerView:

import SwiftUI

struct UserAddedTimer: View {

@EnvironmentObject var viewModel: TimerViewModel

@State var timerSeconds: Int = 0

var body: some View {
    VStack {
        Spacer()
        Stepper(value: $timerSeconds, in: 0...59, step: 1) {
            Text("Seconds: \(timerSeconds)")
                .font(.title2)
        }
            .padding()
            .padding(.horizontal, 15)
        Divider()
        Button("Add Timer") {
            viewModel.appendTimerArray(timeRemainingSeconds: timerSeconds)
            viewModel.timersArray.append(viewModel.createTimer(timerNumber: viewModel.timerModelArray.count - 1))
            
        }
        .font(.title2)
        .frame(width: 200, height: 60, alignment: .center)
        .background(.secondary)
        .cornerRadius(10)
        .padding(.top, 40)
        .padding(.bottom, 15)
    }
    .background(.ultraThinMaterial)
}
}
Answer