@State と Binding() を引数に受けるメソッドを使う場合で考えます。
「Binding」の意味のおさらいです。
@State var text = ""
TextField("text", text: $text)
@State var text = ""
TextField(
"text",
text: Binding(
get: { text },
set: { newValue in text = newValue }
)
)
双方向にデータは流れます。
🤔 単方向にデータを流す
State を外出しすることで、データの流れを単方向にします。
@Observable final class StateHolder {
var text = ""
}
var stateHolder = StateHolder()
TextField("text", text: Binding(
get: { stateHolder.text },
set: { newValue in stateHolder.text = newValue })
)
var stateHolder = StateHolder()
@Bindable var sh = stateHolder
TextField("text", text: $sh.text)
🤔 まとめ
@State + $ での双方向のバインディングは、
外だしの @Observable クラスを使うことで、
単方向に流すことができます。
👉 【SwiftUI】ModelView は StateHolder なのか ? - ModelView の役割
👉 【SwiftUI】View のロジック部分を外出しにする構成