プロパティラッパである構造体Stateでは、計算型プロパティとして{get nonmutating set}が定義されていますが、セッターでは、nonmutatingが宣言されているので、State構造体の値自体に変更はありません。
プレイグラウンドで以下のように実験すると、変更がないことがわかります。
import SwiftUI
var state_i: State<Int> = State.init(wrappedValue: 3) //_value: 3, _location: nil
state_i.wrappedValue = 1 // _value: 3, _location: nil
しかし、例えば、ビューのボタンを押したときに、状態変数に新たな値が代入されるというアクションがあるとすれば、それは当然、状態変数の値が変わり、ビューにも反映されます。一体それはどうしてでしょうか。
何かしらのイベント(ユーザー操作など)が起こると、source of truthであるStateで状態が新たに更新されます。そして、body以下のビューにレンダリングを要求し、ビューの更新が行われるのだと思います。
しかし、State構造体では、値の更新が循環されるような仕組みが導入されていないように見えるのに、なぜ、上手く値が更新されるのでしょうか。
該当のソースコード
import SwiftUI
struct HelloView: View {
@State private var name: String = "" var body: some View { Button(action: {self.name = "Hello!" }) { //新たに値が代入されるが、Stateの値に変更はない Text(self.name) //しかし、ビューにはきちんと反映する } .padding(10) }
}
補足情報(FW/ツールのバージョンなど)
環境
MacOS 10.15.7
Xcode 12.1
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/19 12:51
2020/11/19 12:58