SwiftUI @State vs 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

  • It is used to update the value of a variable every time.
  • We can also say it's a two way binding.
  • If we change the property state then SwiftUI will automatically reload the body of the view.
  • It is used for simple properties like strings, integers and booleans.

@Binding

  • Using this, you can access the state property of another view.
  • It will give you the read and write access for the variable.

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

  • A State property is connected to the view. A State property is permanently being read by the view. That means that every time the @State property gets changed/updated, the view gets re-rendered and eventually displays the content depending on the @State's data.
  • State is accessible only to a particular view.
  • Simple properties like strings, integers and booleans belongs to a single view - mark as private.
  • All the fields marked as State are stored in special separated memory, where only corresponded view can access and update them.

@Binding

  • BindableObject protocol, which requires a didChange property. It makes possible to use it inside Environment and rebuild view as soon as it changes.
  • The didChange property should be a Publisher, which is a part of a new Apple’s Reactive framework called Combine.
  • The main goal of Publisher is to notify all subscribers when something changes. As soon as new values appear, SwiftUI will rebuild Views.

@EnvironmentObject

  • It is a part of feature called Environment. You can populate your Environment with all needed service classes and then access them from any view inside that Environment.
  • @EnvironmentObject is accessible for every view inside the Environment.
  • @EnvironmentObject Properties created elsewhere such as shared data. App crashes if it is missing.
  • The Environment is the right way of Dependency Injection with SwiftUI.

Tags:

Ios

Swiftui