SwiftUIでは、@Stateと@Bindingはビュー間でデータを管理するための重要なプロパティラッパーです。それぞれの特性や使い方について解説します。
@Stateについて
@Stateは、SwiftUIで状態を管理するためのプロパティラッパーです。これを使用すると、ビュー内で値の変更を監視し、変更時にビューを更新することができます。
ここでは、@Stateの活用方法について解説します。
@Stateのサンプルコード
import SwiftUI
struct StateSmpView: View {
@State private var counter = 0
var body: some View {
VStack {
Text("Counter: \(counter)")
Button {
counter+=1
} label: {
Label("Add Counter", systemImage: "plus.circle")
}
Button {
counter=0
} label: {
Label("Reset Counter", systemImage: "delete.right.fill")
}
}
}
}上記の例では、@Stateプロパティラッパーを使ってcounterという状態を定義しています。この状態は、ビュー内での変更を追跡し、変更があるとビューを自動的に再描画します。
状態の更新
Button {
counter+=1
} label: {
Label("Add Counter", systemImage: "plus.circle")
}@Stateを使った状態は、ビュー内で変更可能です。例えば、ボタンをタップするとcounterの値が増加し、Textビューに表示される値が更新されます。
スコープに関する注意点
@Stateは基本的にローカルスコープです。つまり、それが定義されたビュー内でのみ有効であり、他のビューやコンポーネントからは直接アクセスできません。
@Stateは通常、親ビューから子ビューに直接渡されます。しかし、子ビューでの変更は親ビューに直接反映されないため、@Bindingを使用することで双方向のデータフローを確立する必要があります。
これらの点を踏まえて、@Stateを使用する際には、それが適切な状況かどうかを十分に検討することが重要です。必要に応じて、@State以外のプロパティラッパー(例えば@Bindingや@ObservedObject)を使用することも検討してください。
@Bindingプロパティラッパーの使い方
@Bindingは、SwiftUIで親ビューから子ビューにデータを双方向で渡すためのプロパティラッパーです。子ビュー内で状態を更新し、その変更を親ビューに伝える際に使用されます。
@Bindingの定義
import SwiftUI
struct BingingSmpView: View {
@Binding var text: String
var body: some View {
TextField("BindingView input", text: $text)
}
}上記の例では、BingingSmpView内で@Bindingプロパティラッパーを使ってtextを定義しています。このプロパティは親ビューから受け取った値を保持し、子ビューで変更された場合に親ビューにも変更を伝えます。
親ビューでの@Bindingの使用
import SwiftUI
struct ParentView: View {
@State private var userInput = ""
var body: some View {
VStack {
Text("ParentView entered: \(userInput)")
BingingSmpView(text: $userInput)
}
}
}ParentViewでは、BingingSmpViewを含んでいます。BingingSmpViewにtextを渡す際に$を使って@Bindingを通じて双方向のデータバインディングを行います。これにより、BingingSmpView内でTextFieldの内容を変更するとParentViewにも変更が反映されます。
注意点
@Bindingは、子ビューが親ビューのデータにアクセスする際に使用されます。@Bindingを使用する際は、親ビューから子ビューへのデータの双方向の流れを明確に理解することが重要です。
まとめ
@Stateは、UI内での状態管理に便利です。ビューが状態の変更を自動的に反映するため、ユーザーとのインタラクションやUIの状態変化によく適しています。
そして@Bindingは、子ビューと親ビュー間でデータの双方向の通信を可能にします。

