I have two @Observable manager classes, which share a reference to a third class. I initialize this setup using a custom init in my App struct, like so:
@main
struct MyApp: App {
private let managerA: ManagerA
private let managerB: ManagerB
init() {
let managerC = ManagerC()
self.managerA = ManagerA(managerC: managerC)
self.managerB = ManagerB(managerC: managerC)
}
var body: some Scene {
WindowGroup {
ContentView()
.environment(managerA)
.environment(managerB)
}
}
}
I've been using this pattern for some time and it has been working fine. However, I just today discovered that @Observable objects are supposed to be initialized as @State vars, as shown in Apple's documentation here. This means I shoud be doing the following:
@main
struct MyApp: App {
@State private var managerA: ManagerA
@State private var managerB: ManagerB
init() {
let managerC = ManagerC()
self.managerA = ManagerA(managerC: managerC)
self.managerB = ManagerB(managerC: managerC)
}
var body: some Scene {
WindowGroup {
ContentView()
.environment(managerA)
.environment(managerB)
}
}
}
I've also seen some examples where the @State vars are initialized manually like this:
@main
struct MyApp: App {
@State private var managerA: ManagerA
@State private var managerB: ManagerB
init() {
let managerC = ManagerC()
let managerA = ManagerA(managerC: managerC)
let managerB = ManagerB(managerC: managerC)
self._managerA = State(initialValue: managerA)
self._managerB = State(initialValue: managerB)
}
var body: some Scene {
WindowGroup {
ContentView()
.environment(managerA)
.environment(managerB)
}
}
}
ChatGPT tells me the third approach is the correct one, but I don't understand why and ChatGPT can't produce a convincing explanation. The compiler doesn't produce any errors or warnings under each approach, and as far as I can tell, they all behave identically with no discernible difference in performance.
Does it matter which pattern I use? Is there a "correct" way?