@Binding — bu nima, qanday ishlaydi va SwiftUI misollari

Muallif: IT Sectr Nashr etilgan: 2026-06-19 O'qish vaqti: 7 daq

@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'rinishi holatiga havola yaratish uchun Property Wrapper
  • Mulkchiliksiz — Binding ma'lumot saqlamaydi, faqat haqiqat manbaiga kirishni ta'minlaydi
  • $ proyeksiyasi — $stateValue @State yoki @StateObject'dan Binding yaratadi
  • Ikki tomonlama bog'lanish — bola ko'rinishidagi o'zgarishlar darhol otada aks etadi
  • Binding.constant — bog'lanishsiz prototiplash uchun sobit qiymat

SwiftUI'da @Binding nima?

@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'ning ikki tomonlama bog'lanishi qanday ishlaydi

@Binding orqali ikki tomonlama bog'lanish mexanizmi Property Wrapper'larning proyeksiyasiga asoslanadi. Ota @State var value: T e'lon qilganda, SwiftUI avtomatik ravishda Binding tipidagi $value proyeksiyasini yaratadi. $value'ni @Binding var value: T bo'lgan bola komponentiga uzatish orqali ikkala ko'rinishni bitta xotira katakchasiga birlashtirasiz. Bola ko'rinishida Binding orqali har qanday yozish ikkala komponentning qayta chizilishiga sabab bo'ladi.

swift
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 beradi. Bu ObservableObject'ning alohida xususiyatlarini butun obyektni uzatmasdan bola ko'rinishlariga uzatish imkonini beradi. Bunday yondashuv torroq bog'lanish beradi va keraksiz qayta chizishlarning oldini oladi.

@Binding vs callback'lar: nimani tanlash

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@BindingCallback'lar
KodBitta annotatsiya + $Closure + chaqiruv
Ko'p sathlilikAvtomatikClosure zanjiri
Test qilishBinding(value:constant)Mock-closure'lar
O'qishlilikYuqoriO'rta
MoslashuvchanlikFaqat ma'lumotHar 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.

Loyihalarda @Binding ishlatish namunalari

@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.

swift
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.

Maxsus Binding yaratish

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.

swift
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.

@Binding bilan xatolar va anti-namunalar

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'. Yechimi — uzatishda har doim $ prefiksidan foydalaning: $text.

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

@Binding va @State o'rtasidagi farq nima?

@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.

@Statesiz Binding yaratish mumkinmi?

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 bir necha uyalanish sathidan qanday uzatiladi?

@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.

Nega Binding.constant interfeysni yangilamaydi?

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.

@Binding ixtiyoriy bo'lishi mumkinmi?

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

  • @Binding — ota ko'rinishi ma'lumotlari bilan ikki tomonlama bog'lanish uchun Property Wrapper
  • Egalik qilmaydi — faqat haqiqat manbaiga kirishni ta'minlaydi
  • $ proyeksiyasi @State, @StateObject'ni bola ko'rinishlariga uzatish uchun Binding'ga aylantiradi
  • Maxsus Binding qo'shimcha mantiq bilan Binding(get:set:) orqali yaratiladi
  • Binding.constant — faqat oldindan ko'rishlar va prototiplar uchun
  • Ko'p sathli uzatish — Binding istalgan uyalanish chuqurligidan o'tadi
  • Callback'larga alternativa — bola komponentlaridan holatni o'zgartirishning deklarativ usuli

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.

Loyihani muhokama qilish

Shuningdek o'qing