Sorry the delay, haven't stumbled on this discussion for a while. I am not quite sure if you need to restructure everything to make this work. But I have found out that having a model object (as in Model-View-Controller or Model-View-ViewModel architecture) is usually a good way to structure SwiftUI apps.
The view simply displays things from the Model object and provides the user a way to manipulate the data (buttons, gestures, etc.).
The model object contains the data and provides functions to manipulate it that the views call.
Model is an ObservableObject having @Published properties. When those properties change, views are recreated with the new data values.
This is what I was suggesting. Every time the timer fires in the Model object, it changes the value(s) of a/some @Published properties, causing the views to be updated.
I have a demo app visualising some sorting algorithms that uses a timer. Basically shows what I described above, but is unfortunately a bit complex for your needs. Anyways, take a look if you still need to.
The class SortCoordinator is here the Model, coordinating the visualisation of sorting algorithms, using a timer. As the timer fires, a step in sorting is done, changing positions of items in an array. The array is a @Published property, so the view updates when two numbers in the array change places while the sorting is advancing.
The ContentView just shows the data from the SortCoordinator, view being updated whenever the @Published properties change.
Search for "timer" in SortCoordinator to see how it is used there and how it updates the properties.