@Binding — bu nədir, necə işləyir və SwiftUI nümunələri

Müəllif: IT Sectr Dərc olunub: 2026-06-19 Oxuma vaxtı: 7 dəq

@Binding SwiftUI-də başqa komponentə məxsus məlumatlara istinad yaradan Property Wrapper-dir. Binding dəyəri müstəqil saxlamır — o, yalnız $ proyeksiyası vasitəsilə mövcud həqiqət mənbəyinə giriş təmin edir. Apple Developer Documentation (2025)-yə görə, Binding məlumatlara birbaşa sahib olmadan ata və uşaq görünüşü arasında reaktiv ikitərəfli əlaqə təmin edir. @Binding dəyişən vəziyyəti iyerarxiyada aşağı ötürmək üçün əsas mexanizmdir.

Əsas məqamlar

  • @Binding — ata görünüşünün vəziyyətinə istinad yaratmaq üçün Property Wrapper
  • Mülkiyyətsiz — Binding məlumat saxlamır, yalnız həqiqət mənbəyinə giriş təmin edir
  • $ proyeksiyası — $stateValue @State və ya @StateObject-dən Binding yaradır
  • İkitərəfli əlaqə — uşaq görünüşündəki dəyişikliklər dərhal atada əks olunur
  • Binding.constant — əlaqəsiz prototipləşdirmə üçün sabit dəyər

SwiftUI-də @Binding nədir?

@Binding — ata görünüşündə saxlanılan xüsusiyyət və uşaq komponenti arasında ikitərəfli əlaqə yaradan Property Wrapper-dir. Binding-in @State-dən əsas fərqi: Binding məlumatlara sahib deyil. O, yalnız həqiqi mənbə — @State, @StateObject vəya valideyndəki digər Binding vasitəsilə dəyəri oxuyur və yazır. Binding olmadan uşaq görünüşləri callbacklər vəya delegatlar olmadan əcdadın vəziyyətini dəyişə bilməzdi.

Binding iki xüsusiyyətli struktur kimi reallaşdırılıb: wrappedValue (cari dəyər) və projectedValue (Binding-in özü, $ vasitəsilə əlçatandır). Uşaq görünüşü Binding vasitəsilə wrappedValue dəyərini dəyişdikdə, SwiftUI dəyişikliyi məlumat mənbəyinə ötürür və bütün asılı görünüşləri yenidən çəkir. Bu, cari yeniləmə dövrü ərzində sinxron şəkildə baş verir.

Vacib xüsusiyyət: @Binding tək səviyyəli ötürmə ilə məhdudlaşmır. Binding iyerarxiyanın bir neçə səviyyəsindən ötürülə bilər — hər bir uşaq komponent eyni məlumat mənbəyinə istinad alır. İstənilən səviyyədə dəyişiklik bütün əlaqəli görünüşlərin vahid yenilənməsinə səbəb olur.

Binding-in ikitərəfli əlaqəsi necə işləyir

@Binding vasitəsilə ikitərəfli əlaqə mexanizmi Property Wrapper-ların proyeksiyasına əsaslanır. Valideyn @State var value: T elan etdikdə, SwiftUI avtomatik olaraq Binding tipində $value proyeksiyasını yaradır. $value-ni @Binding var value: T olan uşaq komponentinə ötürməklə hər iki görünüşü bir yaddaş xanasına birləşdirirsiniz. Uşaq görünüşündə Binding vasitəsilə hər hansı yazma hər iki komponentin yenidən çəkilməsinə səbəb olur.

swift
struct SliderContainer: View {
    @State private var value: Double = 0.5

    var body: some View {
        VStack {
            Text("Dəyər: \(value)")
            SliderView(value: $value)
        }
    }
}

struct SliderView: View {
    @Binding var value: Double

    var body: some View {
        Slider(value: $value, in: 0...1)
    }
}

Nümunədə SliderContainer @State value-ya sahibdir, SliderView isə $value vasitəsilə Binding alır. SliderView-in daxilindəki Slider bu Binding-ə bağlıdır. Sürgü sürüşdürüldükdə Slider Binding vasitəsilə dəyəri dəyişir, bu da SliderContainer-də @State-i avtomatik yeniləyir və hər iki görünüş cari rəqəmi göstərir. Bütün zəncir heç bir callback vəya bildiriş olmadan işləyir.

@StateObject vəya @ObservedObject-dən Binding yaratmaq üçün eyni proyeksiyadan istifadə olunur: $object.property Binding verir. Bu, ObservableObject-in ayrı-ayrı xüsusiyyətlərini bütün obyekti ötürmədən uşaq görünüşlərinə ötürməyə imkan verir. Belə yanaşma daha dar bağlama verir və lazımsız yenidən çəkilmələrin qarşısını alır.

@Binding vs callbacklər: nə seçmək

SwiftUI-dən əvvəl dəyişiklikləri iyerarxiyada yuxarı ötürməyin standart yolu callbacklər və delegatlar idi: valideyn bir closure ötürür, uşaq komponent dəyişiklik zamanı onu çağırırdı. @Binding daha az kod və daha deklarativ sintaksis ilə alternativ təklif edir. Tamamlama closure-i ötürmək əvəzinə $stateValue ötürmək kifayətdir.

Meyar@BindingCallbacklər
KodBir annotasiya + $Closure + çağırış
ÇoxsəviyyəlilikAvtomatikClosure zənciri
Test etməBinding(value:constant)Mock-closurelar
OxunaqlılıqYüksəkOrta
ÇeviklikYalnız məlumatİstənilən məntiq

@Binding istifadə edin, uşaq görünüşü yalnız dəyəri oxumalı və dəyişdirməlidirsə. Dəyişiklik zamanı əlavə hərəkətlər (doğrulama, jurnallaşdırma, şəbəkə sorğusu) tələb olunarsa, Binding-i callback ilə birləşdirin: məlumat üçün Binding, hadisələr üçün closure ötürün. Məsələn, TextField Binding-ə bağlana bilər, onChange isə doğrulamanı işə sala bilər.

Layihələrdə @Binding istifadə nümunələri

@Binding bir neçə tipik ssenaridə tətbiq olunur. Birincisi — xüsusi idarəetmələr: açarlar, sürgülər, rəng seçiciləri və digər interaktiv elementlər ikitərəfli sinxronizasiya üçün Binding qəbul edir. İkincisi — modal pəncərələr: sheet göstərmə bayrağı Binding kimi ötürülür, uşaq görünüşünə presentationMode vəya birbaşa təyinat vasitəsilə özünü bağlamağa imkan verir.

Üçüncü nümunə — bölünmüş formalar. Forma çoxlu sahələrdən ibarətdirsə, hər bir sahə öz dəyəri üçün Binding qəbul edən ayrı komponentə çıxarıla bilər. Bu, sahələrin müxtəlif formalar arasında test edilməsini və təkrar istifadəsini asanlaşdırır. Valideyn komponent forma modelinin yeganə sahibi olaraq qalır.

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 başlıq və sətirə Binding qəbul edir. O, etiket və ötürülən Binding-ə bağlı TextField göstərir. İstənilən forma hər bir sahə üçün $property ötürməklə FormField-dən dəfələrlə istifadə edə bilər. Bu, işarələmənin təkrarlanmasını azaldır və mətn sahələrinin stilləşdirilməsini mərkəzləşdirir.

Xüsusi Binding yaratmaq

SwiftUI Binding(get:set:) başlatıcısı vasitəsilə Bindingi əl ilə yaratmağa imkan verir. Bu, dəyəri oxuyarkən vəya yazarkən məntiq əlavə etmək lazım olduqda faydalıdır. Məsələn, yazmadan əvvəl rəqəmi formatlaşdıran Binding vəya hər dəyişiklikdə dəyəri uzaq serverlə sinxronlaşdıran Binding yarada bilərsiniz.

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)
    }
}

Laynhda xüsusi emailBinding hər dəyişiklikdə mətni avtomatik olaraq kiçik hərflərə çevirir və boşluqları kəsir. TextField $email-ə birbaşa bağlamaq əvəzinə bu Binding-dən istifadə edir. Belə yanaşma doğrulama və məlumat transformasiyasını Binding daxilində mərkəzləşdirməyə imkan verir, kodu onChange işləyiciləri ilə qarışdırmadan.

@Binding ilə səhvlər və anti-nümunələr

Birinci və ən geniş yayılmış səhv — Binding əvəzinə dəyər ötürmək. Uşaq komponent @Binding var text: String elan edirsə, valideyn isə text ($$-siz) ötürürsə, kompilyator xəta verir: Cannot convert value of type 'String' to expected argument type 'Binding'. Həlli — ötürərkən həmişə $ prefiksindən istifadə edin: $text.

İkinci səhv — yalnız oxuma məlumatlarına Binding. Uşaq görünüşü yalnız dəyəri oxumağa ehtiyac duyursa, @Binding istifadə etməyin — adi let vəya valideyndən @State kifayətdir. Binding yazma imkanını nəzərdə tutur, artıq dəyişdirmə hüquqları sazlamağı çətinləşdirir və minimal imtiyaz prinsipini pozur.

Üçüncü problem — produksiyada Binding.constant. Binding.constant(value) əlaqəsiz saxta bağlama yaradır — dəyişikliklər nəzərə alınmır. constant yalnız prototipləşdirmə və ön izləmələr (Xcode Previews) üçün istifadə edin, real koddə heç vaxt. Testlər üçün idarə olunan davranışı olan Binding(get:set:) istifadə edin.

Tez-tez verilən suallar

@Binding və @State arasında fərq nədir?

@State məlumatlara sahibdir və onların yaddaşda saxlanmasını idarə edir. @Binding yalnız mövcud vəziyyətə istinad edir, sahib olmur. @State həmişə private, @Binding — uşaq görünüşünün giriş parametridir.

@State olmadan Binding yaratmaq mümkündürmü?

Bəli, Binding(get:set:) başlatıcısı vəya Binding.constant(value) vasitəsilə. Həmçinin Binding @StateObject-dən $object.$property proyeksiyası və Publisher-dən Subscribe daxilində Binding(get:set:) vasitəsilə əldə edilə bilər.

Binding bir neçə yuvalanma səviyyəsindən necə ötürülür?

@Binding zəncir boyunca ötürülür: hər bir aralıq komponent @Binding elan edir və onu $ vasitəsilə daha da ötürür. Bütün səviyyələr kök görünüşdəki bir məlumat mənbəyinə istinad edir.

Niyə Binding.constant interfeysi yeniləmir?

Binding.constant səssiz sarğı yaradır — setter yeni dəyərləri nəzərə almır. O, yalnız prototipləşdirmə və SwiftUI Previews üçün nəzərdə tutulub, burada uşaq komponentdən əlaqə tələb olunmur.

@Binding isteğe bağlı ola bilərmi?

Bəli, Binding<T?> dəstəklənir. Binding<String?> ötürsəniz, uşaq görünüşü nil təyin edə bilər. Bu, isteğe bağlı form sahələri vəya sıfırlama imkanı olan vəziyyətlər üçün əlverişlidir.

Nəticə

  • @Binding — ata görünüşünün məlumatları ilə ikitərəfli əlaqə üçün Property Wrapper
  • Sahib deyil — yalnız həqiqət mənbəyinə giriş təmin edir
  • $ proyeksiyası @State, @StateObject-i uşaq görünüşlərinə ötürmək üçün Binding-ə çevirir
  • Xüsusi Binding əlavə məntiqlə Binding(get:set:) vasitəsilə yaradılır
  • Binding.constant — yalnız ön izləmələr və prototiplər üçün
  • Çoxsəviyyəli ötürmə — Binding istənilən yuvalanma dərinliyindən keçir
  • Callbacklərə alternativ — uşaq komponentlərdən vəziyyəti dəyişməyin deklarativ yolu

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun