前回で、1つの変数の変化に応じてViewが再構築できるのを確認しました。
でも、他のViewも更新したい or 他のViewで変数が更新されるかも のときは?
@Bindingとは?
他のビューとの依存関係を定義したいときは、Bindingを使います。
Binding指定をすることで、他で定義されている変数を参照していることを指定していることになります。いずれにしても、View階層の中で閉じる必要があります。
サンプル
@Stateのサンプルで、countを参照するビューを別Structにしてみました。
渡すときには、Binding対象を$変数名>として渡し、受け取る側のViewでは、@Binding属性をつけて定義する必要があります。
struct ContentView: View { @State private var count:Int = 0 var body: some View { HStack() { Button.init("-", action: { self.count = self.count - 1 }) SubView(count:$count) Button.init("+", action: { self.count = self.count + 1 }) } } } struct SubView:View { @Binding var count:Int var body: some View { VStack { Text("\(count)") } } }
動作説明
@Stateの例と同じです。
まとめ
Classは、参照渡しが基本ですが、いま使っているStructは、基本的に、値渡しをされます。
つまり、(メモリ上の)同じ値を参照することが難しくなっています。そのような状況で、参照するためのものが、@Bindingです。i.e. 参照渡しであることを明示しているような理解で良いかと思います。
@Bindingの上記の例は、全てのデータをバケツリレーのように渡していかなければいけないことを暗示してます。ということで、途中のビューを飛ばして渡す方法を理解することが次のステップになります。
Sponsor Link