@Binding (@Binding)
@Binding در SwiftUI یعنی «پل ارتباطیِ داده». یک ویوِ فرزند، مستقیماً به حالتِ والد وصل می شود. سپس هر تغییری، همان لحظه برمی گردد. مثل دفتر حضور که نماینده کلاس می نویسد و معلم همزمان می بیند.
@Binding چیست؟
Binding یعنی ارجاعِ دوطرفه به داده والد. «دوطرفه» یعنی خواندن و نوشتن. وقتی کودک مقدار را عوض کند، مقدارِ والد فوراً تغییر می کند. بنابراین رابط کاربری همیشه هماهنگ می ماند.
مثال: اتصال ورودی فرزند به حالت والد
در این نمونه، متن در فرزند تایپ می شود. اما مقدارِ والد به روز می شود. چون فرزند، یک Binding از والد گرفته است.
import SwiftUI
struct Child: View {
@Binding var text: String
var body: some View {
TextField("Enter", text: $text)
.textFieldStyle(.roundedBorder)
}
}
struct Parent: View {
@State private var name = "Kai"
var body: some View {
VStack {
Text(name)
Child(text: $name)
}
.padding()
}
}
struct ContentView: View {
var body: some View {
Parent()
}
}
@main
struct MyApp: App {
var body: some Scene {
WindowGroup {
ContentView()
}
}
}
نکته: والد صاحب داده است. فرزند فقط از راه Binding تغییر می دهد. بنابراین منبعِ حقیقت، همچنان در والد می ماند.
گام های عملی
- در والد یک @State تعریف کن.
- فرزند را بساز و پارامتر @Binding بده.
- هنگام صدا زدن، از $state برای Binding استفاده کن.
- تغییر در فرزند را روی والد ببین.
اشتباه های رایج
- State را مستقیم به فرزند نده؛ Binding بده.
- داده سراسری را Binding نکن؛ از ObservableObject استفاده کن.
- مالکیت داده نباید گم شود؛ والد مالک است.
مطالعه مرتبط
برای مقدمه کامل، صفحه جریان داده SwiftUI را ببین. همچنین بخش @State برای مالکیت محلی مهم است. خود این صفحه @Binding در SwiftUI را نشانه گذاری کن.
جمع بندی سریع
- @Binding یعنی ارتباط دوطرفه.
- والد مالک داده می ماند.
- فرزند با Binding مقدار را عوض می کند.
- برای داده سراسری، سراغ ObservableObject برو.