EnvironmentObjects

EnvironmentObject nos permite inyectar a varias vistas la instancia de una clase - siempre que esta forme parte del protocolo ObservableObject. De esta forma en vez de pasar el modelo de forma explícita en cada una de las vistas podemos agregar el @EnvironmentObject.

Funciona entonces como un property wrapper una estructura que permite encapsular nuestra parte del código para que acceda así a las propiedades o métodos que tengamos albergados en nuestra clase.

De esta forma podríamos tener por ejemplo una vista formada por varios componentes e inyectarle a aquellos que lo necesiten la clase. Suele utilizarse para propiedades que se crean en algún lugar de nuestra app, pero se usarán en varios domo por ejemplo data compartida.

VStack() {

	OneView()
    .environmentObject(myModel)

	AnotherView()
	EvenOtherView()
    .environmentObject(myModel)
}

StateObjects

El StateObject es también un tipo property wrapper sin embargo en este caso, lo que hace es que inicializa la instancia de nuestra clase observada y la guarda para luego ser utilizada.

Para ello la clase instanciada debe también formar parte del protocolo ObservableObject. En el caso que dicha clase tenga propiedades marcadas como @Published el StateObject se refrescará para mostrar los cambios del objeto.

@StateObject tiene cierta responsabilidad cuando una vista usa el @StateObject le estamos diciendo a Swift que ahí crearemos el objeto y que esa vista es la dueña de los datos y la responsable de darle vida. Cualquier otra vista que quiera hacer uso de ella deberá realizarlo utilizando @ObservedObject

struct WordleApp: App {
    
    @StateObject var dataModel = WordleDataModel()
    @StateObject var colorSchemeManager = ColorSchemeManager()
    
    var body: some Scene {
        
        WindowGroup {
            
            GameView()
                .environmentObject(dataModel)
                .environmentObject(colorSchemeManager)
                .onAppear {
                    
                    colorSchemeManager.applyColorScheme()
                }
        }
    }
}

Extra

https://www.youtube.com/watch?v=-yjKAb0Pj60

The difference between @StateObject, @EnvironmentObject, and @ObservedObject in SwiftUI