@Binding SwiftUI'da boshqa komponentga tegishli ma'lumotlarga havola yaratuvchi Property Wrapperdir. Binding qiymatni mustaqil saqlamaydi — u faqat $ proyeksiyasi orqali mavjud haqiqat manbaiga kirishni ta'minlaydi. Apple Developer Documentation (2025) ga ko'ra, Binding ma'lumotlarga to'g'ridan-to'g'ri egalik qilmasdan ota va bola ko'rinishi o'rtasida reaktiv ikki tomonlama bog'lanishni ta'minlaydi. @Binding o'zgaruvchan holatni iyerarxiya bo'ylab pastga uzatishning asosiy mexanizmidir.
Asosiy fikrlar
@Binding — ota ko'rinishida saqlanadigan xususiyat va bola komponenti o'rtasida ikki tomonlama bog'lanish yaratuvchi Property Wrapperdir. Binding'ning @State'dan asosiy farqi: Binding ma'lumotlarga egalik qilmaydi. U faqat haqiqiy manba — @State, @StateObject yoki ota'dagi boshqa Binding orqali qiymatni o'qiydi va yozadi. Binding bo'lmasa, bola ko'rinishlari callback'lar yoki delegatlar'siz ajdodning holatini o'zgartira olmasdi.
Binding ikki xususiyatli struktura sifatida amalga oshirilgan: wrappedValue (joriy qiymat) va projectedValue (Binding'ning o'zi, $ orqali mavjud). Bola ko'rinishi Binding orqali wrappedValue'ni o'zgartirganda, SwiftUI o'zgarishni ma'lumot manbaiga uzatadi va barcha bog'liq ko'rinishlarni qayta chizadi. Bu joriy yangilanish sikli davomida sinxron ravishda sodir bo'ladi.
Muhim xususiyat: @Binding bir sathli uzatish bilan chegaralanmaydi. Binding iyerarxiyaning bir necha sathlari orqali uzatilishi mumkin — har bir bola komponenti bir xil ma'lumot manbaiga havola oladi. Har qanday sathdagi o'zgarish barcha bog'liq ko'rinishlarning yagona yangilanishiga sabab bo'ladi.
@Binding orqali ikki tomonlama bog'lanish mexanizmi Property Wrapper'larning proyeksiyasiga asoslanadi. Ota @State var value: T e'lon qilganda, SwiftUI avtomatik ravishda Binding
struct SliderContainer: View {
@State private var value: Double = 0.5
var body: some View {
VStack {
Text("Qiymat: \(value)")
SliderView(value: $value)
}
}
}
struct SliderView: View {
@Binding var value: Double
var body: some View {
Slider(value: $value, in: 0...1)
}
}
Misolda SliderContainer @State value'ga ega, SliderView esa $value orqali Binding oladi. SliderView ichidagi Slider ushbu Binding'ga bog'langan. Surgich tortilganda Slider Binding orqali qiymatni o'zgartiradi, bu avtomatik ravishda SliderContainer'dagi @State'ni yangilaydi va ikkala ko'rinish joriy raqamni ko'rsatadi. Butun zanjir hech qanday callback yoki bildirishsiz ishlaydi.
@StateObject yoki @ObservedObject'dan Binding yaratish uchun xuddi shu proyeksiyadan foydalaniladi: $object.property Binding
SwiftUI'dan oldin o'zgarishlarni iyerarxiya bo'ylab yuqoriga uzatishning standart usuli callback'lar va delegatlar edi: ota closure'ni uzatar, bola komponenti o'zgarish vaqtida uni chaqirardi. @Binding kamroq kod va deklarativroq sintaksis bilan muqobil taklif qiladi. Yakunlash closure'ini uzatish o'rniga $stateValue uzatish kifoya.
| Mezon | @Binding | Callback'lar |
|---|---|---|
| Kod | Bitta annotatsiya + $ | Closure + chaqiruv |
| Ko'p sathlilik | Avtomatik | Closure zanjiri |
| Test qilish | Binding(value:constant) | Mock-closure'lar |
| O'qishlilik | Yuqori | O'rta |
| Moslashuvchanlik | Faqat ma'lumot | Har qanday mantiq |
@Binding dan foydalaning, agar bola ko'rinishi faqat qiymatni o'qishi va o'zgartirishi kerak bo'lsa. Agar o'zgarish vaqtida qo'shimcha harakatlar (tekshirish, jurnallash, tarmoq so'rovi) talab qilinsa, Binding'ni callback bilan birlashtiring: ma'lumot uchun Binding, hodisalar uchun closure'ni uzating. Masalan, TextField Binding'ga bog'lanishi mumkin, onChange esa tekshirishni ishga tushiradi.
@Binding bir necha odatiy stsenariyda qo'llaniladi. Birinchisi — maxsus boshqaruv elementlari: kalitlar, surgichlar, rang tanlagichlar va boshqa interaktiv elementlar ikki tomonlama sinxronlash uchun Binding qabul qiladi. Ikkinchisi — modal oynalar: sheet ko'rsatish bayrog'i Binding sifatida uzatiladi, bola ko'rinishiga presentationMode yoki to'g'ridan-to'g'ri o'rnatish orqali o'zini yopish imkonini beradi.
Uchinchi namuna — ajratilgan formalar. Agar forma ko'p maydonlardan iborat bo'lsa, har bir maydon o'z qiymati uchun Binding qabul qiluvchi alohida komponentga ajratilishi mumkin. Bu maydonlarni turli formalar o'rtasida test qilish va qayta ishlatishni osonlashtiradi. Ota komponent butun forma modelining yagona egasi bo'lib qoladi.
struct FormField: View {
let title: String
@Binding var text: String
var body: some View {
VStack(alignment: .leading) {
Text(title).font(.caption)
TextField("Enter \(title.lowercased())", text: $text)
.textFieldStyle(.roundedBorder)
}
}
}
FormField komponenti sarlavha va satrga Binding qabul qiladi. U yorliq va uzatilgan Binding'ga bog'langan TextField'ni ko'rsatadi. Har qanday forma har bir maydon uchun $property'ni uzatish orqali FormField'dan bir necha marta foydalanishi mumkin. Bu belgilashning takrorlanishini kamaytiradi va matn maydonlarini stillashtirishni markazlashtiradi.
SwiftUI Binding(get:set:) boshlatgichi orqali Bindingni qo'lda yaratishga imkon beradi. Bu qiymatni o'qish yoki yozishda mantiq qo'shish kerak bo'lganda foydalidir. Masalan, yozishdan oldin raqamni formatlaydigan Binding yoki har o'zgarishda qiymatni uzoq server bilan sinxronlaydigan Binding yaratishingiz mumkin.
struct ValidatedField: View {
@State private var email: String = ""
var emailBinding: Binding<String> {
.init(
get: { email },
set: { email = $0.lowercased().trimmingCharacters(in: .whitespaces) }
)
}
var body: some View {
TextField("Email", text: emailBinding)
}
}
Listingda maxsus emailBinding har o'zgarishda matnni avtomatik ravishda kichik harflarga o'tkazadi va bo'shliqlarni olib tashlaydi. TextField $email'ga to'g'ridan-to'g'ri bog'lanish o'rniga ushbu Binding'dan foydalanadi. Bunday yondashuv tekshirish va ma'lumot transformatsiyasini Binding ichida markazlashtirish imkonini beradi, kodni onChange ishlovchilari bilan ifloslantirmasdan.
Birinchi va eng keng tarqalgan xato — Binding o'rniga qiymat uzatish. Agar bola komponenti @Binding var text: String e'lon qilsa, ota esa text ($$siz) uzatsa, kompilyator xato beradi: Cannot convert value of type 'String' to expected argument type 'Binding
Ikkinchi xato — faqat o'qish ma'lumotlariga Binding. Agar bola ko'rinishi faqat qiymatni o'qishi kerak bo'lsa, @Binding ishlatmang — oddiy let yoki otadan @State yetarli. Binding yozish imkoniyatini nazarda tutadi, ortiqcha o'zgartirish huquqlari disk raskladkani murakkablashtiradi va minimal imtiyozlar prinsipini buzadi.
Uchinchi muammo — produksiyada Binding.constant. Binding.constant(value) bog'lanishsiz soxta ulanish yaratadi — o'zgarishlar e'tiborga olinmaydi. constant'ni faqat prototiplash va oldindan ko'rishlar (Xcode Previews) uchun ishlating, real kodda hech qachon. Testlar uchun boshqariladigan xatti-harakatga ega Binding(get:set:) dan foydalaning.
Tez-tez beriladigan savollar
@State ma'lumotlarga egalik qiladi va ularni xotirada saqlashni boshqaradi. @Binding faqat mavjud holatga havola qiladi, egalik qilmaydi. @State har doim private, @Binding — bola ko'rinishining kirish parametri.
Ha, Binding(get:set:) boshlatgichi yoki Binding.constant(value) orqali. Shuningdek, Binding @StateObject'dan $object.$property proyeksiyasi va Publisher'dan Subscribe ichidagi Binding(get:set:) orqali olinishi mumkin.
@Binding zanjir bo'ylab uzatiladi: har bir oraliq komponent @Binding e'lon qiladi va uni $ orqali keyinga uzatadi. Barcha sathlar ildiz ko'rinishidagi bitta ma'lumot manbaiga havola qiladi.
Binding.constant jim o' rash yaratadi — setter yangi qiymatlarni e'tiborga olmaydi. U faqat prototiplash va SwiftUI Previews uchun mo'ljallangan, bu yerda bola komponentidan bog'lanish talab qilinmaydi.
Ha, Binding<T?> qo'llab-quvvatlanadi. Agar Binding<String?> uzatsangiz, bola ko'rinishi nil o'rnatishi mumkin. Bu ixtiyoriy forma maydonlari yoki qayta o'rnatish imkoniyati bo'lgan holatlar uchun qulay.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.