私はいくつかのWWDCビデオとデータバインディングに関するApple docsを見て、現在の理解によれば、プロパティデリゲートとしての@Stateはビューと注釈付きプロパティの間のバインディング接続を提供します。例えば:
@State var myText: String
var body: some View {
VStack {
TextField($myText, placeholder: Text("input"))
Text(myText)
}
}
これはmyTextを私が追加したテキストフィールドのコンテンツにバインドします(つまり、一方が変更され、もう一方が更新されます)。
ただし、$ myTextがBindingのバインディングタイプを参照していることは知っていますが、Bindingもプロパティデリゲートであることに気付き、Appleの一部のコード例に表示されていることに気付きました。これがプロパティデリゲートとして何に使用されるのか私にはわかりません。 @Stateはすでにバインディングを機能させていますが、@ Bindingには何が必要ですか? Apple docsとりあえず、これについては吸ってください。
このWWDCトークによると(Swift UIを介したデータフロー):
https://developer.Apple.com/wwdc19/226
_@State
_は、View
内のローカル/プライベートの変更に使用する必要があります。理想的には、それらはプライベートです。
_@Binding
_は、値が現在のビュードメインoutside
に存在する場合、サブビュー/再利用可能なコンポーネントで使用する必要があります。
presentation(:_)
APIで確認できます。
おそらくそれらの内部にたくさんの状態があり、それらを表示する方法をSwiftUI
に伝えます-しかし、表示するかどうかの決定はスーパービュー次第です。したがって、_@Binding
_(isShowing
)提供する必要があります。
@Stateは真実のソースの概要を示すもう1つの@propertyWrapperです。
"...状態を使用する場合、フレームワークは変数に永続ストレージを割り当て、依存関係として追跡します...常に初期定数値を指定する必要があります"- WWDC19セッション226 (07:41)
状態に明示的に依存する、さらに別の@propertyWrapperの@Binding。
「... Bindingプロパティラッパーを使用することで、真実のソースへの明示的な依存関係を所有せずに定義します。さらに、バインディングは状態から派生できるため、初期値を指定する必要はありません。」 - WWDC19セッション226 (13:01)
Binding<T>
は@Binding
のプロパティデリゲートです。
$ myTextはBinding<String>
を提供します。
あなたが説明したように@State
が "バインディング作業を行う"方法は、Binding<String>
のインスタンスの参照をキャプチャするゲッター/セッターで初期化されたState<T>
を提供することです。
次に、TextField
は、パスインバインディングのセッターを呼び出してmyTextの値を変更します。これにより、実際にmyTextを設定するState<T>
のセッターが呼び出されます。
ご覧のとおり、バインディングには実際に格納されたプロパティが必要ではなく、ストレージを持っている他のインスタンス(この場合は@State
)に委譲します。したがって、名前。