Property wrappers in SwiftUI: How to choose between @EnvironmentObject, @ObservableObject and more