@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üşü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 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
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
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 | @Binding | Callbacklər |
|---|---|---|
| Kod | Bir annotasiya + $ | Closure + çağırış |
| Çoxsəviyyəlilik | Avtomatik | Closure zənciri |
| Test etmə | Binding(value:constant) | Mock-closurelar |
| Oxunaqlılıq | Yüksək | Orta |
| Çeviklik | Yalnı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.
@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.
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.
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.
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.
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
İ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
@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.
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 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.
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.
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ə
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.
Həm də oxuyun