@AppStorage → This property wrapper reads and writes values from UserDefaults.
@Environment → This property wrapper allows you to access data from the system, such as knowing the size class of the device, or dismissing a view.
@Binding → When a variable is declared with this property wrapper, changes to its value will be returned to the calling view.
@State → When a variable is declared with this property wrapper, it is used to store small amounts of data local to the view whose value may affect the appearance of the view.
This question belongs to View Building with SwiftUI , specifically the objective about using @State, @Binding, @Environment, and related wrappers to share and manage data between views. @AppStorage is the wrapper that connects a SwiftUI value to UserDefaults, so it is the correct match for reading and writing persisted user defaults data. Apple documents AppStorage as a property wrapper type that reflects a value from UserDefaults and updates the view when that value changes.
@Environment is used to read values supplied by the system or ancestor views, including interface context like size classes and actions such as dismissing a presented view. Apple’s environment documentation explains that SwiftUI automatically sets and updates many environment values for layout and behavior, and App Dev Training materials show environment values being used to dismiss a view.
@Binding represents a two-way connection to a value owned elsewhere, typically in a parent view, so changes made through the binding are reflected back in the source of truth. Apple’s SwiftUI data-flow guidance describes bindings as the mechanism used when a child view needs shared control of state with another view.
@State is the correct wrapper for small, local, mutable view state. Apple describes State as the source of truth for data local to a view and recommends it for interface state that affects rendering.