I am learning iOS Programming with Swift and SwiftUI. I know very little and I am very confuse about the difference between a @State
and a Binding<*>
Think of State
as the single source of truth for your view, as a means of mutating a variable & invalidating the view to reflect that state.
Binding
on the other hand, is a two-way connection between a view and its underlying model.
A means of mutating a State
that is not managed by the view (for example a Toggle
that reflects and controls a bool value that the control itself has no knowledge about its storage or origin)
Finally, you can get a Binding
from any State
by using the $
prefix operator.
A simple guide for choosing between them would be:
Do I need to modify a value that is private to me? => State
Do I need to modify a State of some other view? => Binding
Both @State
and @Binding
are property wrappers.
@State
@Binding
Here is the notes I have prepared for myself,
@State:
@Binding:
Thanks!
SwiftUI is a declarative Component-Oriented framework. You have to forget about MVC where you have controllers mediating between view and model. SwiftUI uses diffing algorithm to understand changes and update only corresponding views.
@State
@Binding
@EnvironmentObject
State
• @State keyword allows us to ask the SwiftUI to monitor the value of the property. Once the value will change, the View will be invalidated and rendered again in efficient manner.
• A persistent value of a given type, through which a view reads and monitors the value.
• It is just another @propertyWrapper that outlines a source of truth.
• When you use state the framework allocate persistence storage for variable and tracks it as a dependency ... you alway has to specify an initial constant value"
Binding
• @Binding and $ prefix allows passing State property into the nested child.
• A manager for a value that provides a way to mutate it.
• @Binding yet another @propertyWrapper that depends explicitly on state.
• By using the Binding property wrapper you define an explicit dependency to a source of truth without owning it, additionally you don't need to specify an initial value because binding can be derived from state.
Link for your reference: https://medium.com/stepstone-tech/swiftui-101-how-to-use-state-and-binding-in-your-first-custom-ui-control-64d395947492
State simple properties like string, integers, and Booleans Belong to a single view - mark as private
Binding complex properties like custom type Sharing data in many views. Required for reference types
EnvironmentObject properties created elsewhere such as shared data App crashes if it is missing.