一応SwiftUIのtutorialとか見てみたけれど"$"とかなんなんだよってなったので調べた。
Stateとは
SwiftUIでViewが変数を監視するために使用する。
Stateの値にアクセスするためには使用する前に"$"をつけなければならない。また、値の変更は宣言したviewのbodyの中でしか行うことができないため、実質privateになっている。
この値が変更されるとview側はbodyの値を必要に応じて再計算し直す。またその逆で、view側になにかstateの変数の値を変化させる操作があった際にstateの変数の中身も変更される。
import SwiftUI
struct ContentView: View {
@State var textData: String = "" // これ。
var body: some View {
var body: some View {
VStack {
TextField("to variable", text: $textData, onCommit: {
// "text: $textData"でバインディングをしている。
// TextFieldの内容が変更されるとtextDataの中身も変更される。(viewからstateを変更する例)
print(self.textData)
})
Button("reset textfield") {
// ボタンが押されるとtextDataが""になり、TextFieldも空になる(stateからviewを変更する例)
self.textData = ""
}
}
}
}
一応SwiftUIのtutorialやってみたけどprefixの"$"とかなんなんだよってなったので調べた。
$とは
この$をつけると、StateはBindingという別の型を作成するらしい。
documentationのStateのページでは以下のように言われている。
You can get a binding from a state with the
binding
property, or by using the$
prefix operator.
ではこのbindingとは一体何なんだという話になるが、view側はstateの変数を直接弄っているのではなく、このbindingを介してstateの変数を弄っているみたい。
documentationのbindingのページでは以下のように言われている。
Use a binding to create a two-way connection between a view and its underlying model. For example, you can create a binding between a Toggle and a Bool property of a State.
実際先の例で$を外してみると「wrapperであるBindingを使えや」みたいなエラーが出てくる。