Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does the dollar sign do in this example?

This tutorial by Apple about SwiftUI uses a dollar sign to bind data, and I‘m having trouble finding more information about this data binding in SwiftUI.

Toggle(isOn: $showFavoritesOnly) { 

You use the $ prefix to access a binding to a state variable, or one of its properties.

Is this some sort of inout type parameter? That uses the ampersand to pass it on.

like image 535
vrwim Avatar asked Jun 11 '19 20:06

vrwim


People also ask

What is the use of dollar sign in?

The dollar sign is most often used to represent a U.S. currency value, e.g., $10.00 for ten dollars. As seen in the picture, the dollar sign looks like the letter "S" with a vertical line going through the middle.

What does '$' do in JavaScript?

The dollar sign ($) and the underscore (_) characters are JavaScript identifiers, which just means that they identify an object in the same way a name would. The objects they identify include things such as variables, functions, properties, events, and objects.

Where does the dollar sign ($) go?

In most English-speaking countries that use that symbol, it is placed to the left of the amount specified, e.g. "$1", read as "one dollar".

What is meaning of dollar sign?

Definition of dollar sign : a mark $ placed before a number to indicate that it stands for dollars.


2 Answers

This is very well explained in WWDC 2019 video 415. You are merely looking at one special case of a broad language feature, namely property wrappers.

A property wrapper (such as @State) is actually a way of referring to an instance of a type (usually a struct or enum) with the same name (such as State). The latter provides instructions for turning this instance property into a computed property whose getter and setter are the getter and setter for a certain computed property of itself (its wrappedValue). It also typically holds private storage backing that computed property.

Thus, after the declaration

@State var showFavoritesOnly = true 

...showFavoritesOnly is turned into a computed property, with its getter and setter supplied by the State struct. When you set showFavoritesOnly to true, that is routed through the State struct's setter and ends up in a stored property of the State instance.

All of this implies that somewhere there is a State instance associated with your showFavoritesOnly. And there is, but it's hidden from view. Its name, in case you'd like to see that State instance, is _showFavoritesOnly.

Okay, but when you say $showFavoritesOnly, you do not get a State struct; you get a Binding struct. Why? That's because a property wrapper has a mechanism for specifying what the returned value from the $ name should be. In the case of State, it specifies that this value should be its own binding property, which is a Binding (see the docs: https://developer.apple.com/documentation/swiftui/state).

By an amazing coincidence, Toggle's isOn initializer takes a Binding (again, see the docs, https://developer.apple.com/documentation/swiftui/toggle/3232112-init). You could not have set the Toggle's isOn to showFavoritesOnly even if you wanted to! Instead, you set it to the Binding<Bool> supplied by the State instance, so that the Toggle has automatic two-way communication with the State object. The SwiftUI framework enforces its own correct usage; a Toggle can exist only in relation to some binding that acts as the underlying source of truth for its on/off state. And because it's a binding, not a mere Bool, communication works in both directions: when the user taps the switch in the Toggle, the change in value flows "up" to the State variable by way of the binding.

like image 197
matt Avatar answered Sep 30 '22 21:09

matt


The $ is used in conjunction with property delegates.

It's not an operator, but a prefix (thanks @matt!).

For more about property delegates, see this Swift Evolution document.

e.g. in @State var aState = false, State is a property delegate.

This means that if we write:

  • aState we're accessing a Bool value
  • $aState we're accessing a Binding<Bool> value

Different property delegates will generate different values.

like image 37
Matteo Pacini Avatar answered Sep 30 '22 21:09

Matteo Pacini