4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

@Stateの$についてのメモ

Posted at

一応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を使えや」みたいなエラーが出てくる。

スクリーンショット 2020-01-12 5.37.27.png

参考サイト

state and data flow(apple)
Bindingとは(apple)
Stateとは(apple)

4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?