Property Wrapper: esas anlayishlar, sintaksis ve numuneler SwiftUI-de

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

Property Wrapper — Swift mexanizmidir, xasselere giris ve deyishiklik zamani kod tekrarlanmadan mentiq qati elave edir. SwiftUI-de Property Wrappers gorunushlerin veziyyetinin idare edilmesinin esasina chevrilib: @State, @Binding, @ObservedObject, @StateObject ve @Environment. Swift senedlerine (2025) gore, xasse sargilari layihelerde sablon kodu orta hesabla 40% azaldir. Property Wrapper anlayishi her bir iOS tertibatchisi uchun framework ile effektiv ish uchun vacibdir.

Esas meqamlar

  • Property Wrapper — xassenin getter ve setterine mentiq elave eden Swift sintaktik konstruksiyasi
  • @State — bir gorunushe aid olan lokal veziyyet uchun sargi
  • @Binding — valideyn gorunushden melumat menbeyi ile ikiterefli elaqe
  • @ObservedObject — sahiblik olmadan xarici ObservableObject-i mushahide
  • @StateObject — cari gorunush seviyyesinde ObservableObject yaratma ve sahiblik

Property Wrapper nedir?

Property Wrapper — Swift 5.1 versiyasinda ortaya cixmish dil konstruksiyasidir, xasseye giris mentiqini ayri bir tipe inkapsulasiya etmeye imkan verir. Her sinifde tekrarlanan getter ve setterler yazmaq evezine, tertibatchi sargini bir defe elan edir ve @ tipinden evvel annotasiya vasitesile tetbiq edir. Swift avtomatik olaraq xasseni gosterilen tipe sarir, oxu ve yazi zamani onun wrappedValue ve projectedValue metodlarini cagirir. Apple-a gore (WWDC 2019), Property Wrappers SwiftUI uchun esas abstraksiyaya chevrilib.

Xasse sargisi @propertyWrapper atributu olan struktur ve ya sinifdir. Daxilde bele tip wrappedValue xassesini heyata kecirmelidir, cari deyeri qaytarir ve teyin edir. Swift kompilyatoru orijinal xasseye muracietleri wrappedValue cagirishlari ile evez edir, tetbiqi cagiran koddan tamamile gizledir. Elave olaraq projectedValue — $ simvolu vasitesile elçatan olan proyeksiya teyin edile biler.

Property Wrappers-in ustunluyu mentiqin tekrar istifadesidir. Meselen, email validasiyasi, deyerlerin keshlenmesi ve ya yaddashla sinxronizasiya uchun sargi yaratmaq olar — ve onu layihede istenilen xasseye tetbiq etmek olar. SwiftUI-de bu konsepsiya her yerde istifade olunur: veziyyetin idare edilmesinin her bir mexanizmi ayri Property Wrapper kimi heyata kecirilib.

Property Wrapper Swift-de nece isleyir?

@WrapperType var value: T annotasiyasi ile xasse elan edilerken Swift kompilyatoru kodu transformasiya edir. O, WrapperType numunesini yaradir ve xasseye girishi wrappedValue vasitesile generasiya edir. Menbe kodu let x = value, let x = _value.wrappedValue-e, value = newValue ise _value.wrappedValue = newValue-e chevrilir. Bu transformasiya kompilasiya merhelesinde bash verir, runtime elave yuku olmadan.

swift
@propertyWrapper
struct Capitalized {
    private var text: String

    var wrappedValue: String {
        get { text }
        set { text = newValue.capitalized }
    }

    init(initialValue: String) {
        text = initialValue.capitalized
    }
}

Listinqde Capitalized sargisi gosterilib, teksti avtomatik olaraq boyuk herfle formatlayir. Deyer teyin edilerken setter yazmadan evvel capitalized cagirir. Indi @Capitalized annotasiyasi olan istenilen xasse yalniz duzgun formatlanmish teksti saxlayacaq. Bu yanashma validasiya ve formatlama kodunun tekrarlanmasini tamamile aradan qaldirir.

Proyeksiya (projectedValue) — $ prefiksi ile elçatan olan elave rabite kanalidir. SwiftUI-de bu imkan her yerde istifade olunur: $state Binding verir, $observedObject ise Published.Publisher qaytarir. Proyeksiya sargiya deyere esas girishi deyishmeden genishlendirilmish interfeys teqdim etmeye imkan verir.

SwiftUI-de esas Property Wrappers

SwiftUI veziyyetin idare edilmesi uchun besh daxili Property Wrapper ehtiva edir: @State, @Binding, @ObservedObject, @StateObject ve @Environment. Onlarin her biri konkret tapshirigi hell edir ve muxtelif ssenarilerde istifade olunur. @State sade lokal melumatlar uchun, @Binding — ushaq gorunushlere melumat referansi ötürmek üçün, @ObservedObject ve @StateObject — murekkeb obyektler uchun, @Environment — iyerarxiyadan sistem deyerleri uchün nezerde tutulub.

WrapperTeyinatSahiblik
@StateBir gorunushun lokal veziyyetiCari gorunush
@BindingValideyn ile ikiterefli elaqeValideyn gorunush
@ObservedObjectXarici obyektin mushahidesiXarici sahib
@StateObjectObservableObject yaradilmasiCari gorunush
@EnvironmentIyerarxiyadan sistem deyerleriSwiftUI muhiti

Konkret Property Wrapper sechimi melumat menbeyinden ve onlarin heyat dövründen asilidir. Melumat bir gorunushe aiddirse ve ushaq komponentlere lazim deyilse — @State istifade edin. Ushaq gorunush valideyn melumatlarini deyishmelidirse — @Binding tetbiq edin. Bir neche gorunushde istifade olunan obyektler uchun @ObservedObject ve @StateObject uyghundur.

@State: gorunushun lokal veziyyeti

@State — bir gorunush daxilinde lokal veziyyeti saxlamaq uchun Property Wrapper-dir. SwiftUI @State-xasseleri uchun avtomatik yaddashi idare edir ve her deyishiklikde gorunushu yeniden chekir. @State yalniz cari gorunushe aid olan sade tipler (String, Int, Bool, enum) ve strukturlar uchün uygundur. Deyer deyishdikde SwiftUI body xassesini yeniden ishe salir.

swift
struct CounterView: View {
    @State private var count: Int = 0

    var body: some View {
        VStack {
            Text("Say: \(count)")
            Button("Artir") {
                count += 1
            }
        }
    }
}

Numunede @State-xassesi count saygacin cari deyerini saxlayir. SwiftUI bu xasse üchün yaddash sahesini yiginda yaradir ve onu CounterView-in heyat dövru ile elaqelendirir. Düyme basildiqda count 1 artir, SwiftUI deyishikliyi ashkarlayir ve body-ni yeniden ishe salaraq yeni deyeri gösterir. Vacib: @State murekkeb referans tipleri üchün istifade edilmemelidir — bunun üchün @StateObject ve @ObservedObject nezerde tutulub.

@Binding: gorunushler arasinda ikiterefli elaqe

@Binding bashqa gorunushe aid olan melumat menbeyine referans yaradir. Binding deyeri musteqil saxlamir — o, @State, @StateObject ve ya valideynden ötürülen diger Binding vasitesile melumatlari oxuyur ve yazir. Bu, ushaq komponentlere melumatlara birbasha sahiblik olmadan ve callbacklere ehtiyac duymadan ecdadin veziyyetini deyishmeye imkan verir.

swift
struct ToggleSwitch: View {
    @Binding var isOn: Bool

    var body: some View {
        Toggle("Switch", isOn: $isOn)
    }
}

Listinqde ToggleSwitch valideyn gorunushden @BindingBool alir. Valideyn @State var isToggleOn = false yaradir ve $isToggleOn-u ToggleSwitch-in initizalizatoruna ötürür. Istifadechi ushaq gorunush daxilinde Toggle-i deyishdikde, deyishiklik derhal valideyn @State-de eks olunur. Binding mexanizmi iyerarxiyada yuxariya deyishikliklerin ötürülmesi üchün delegat ve ya closurelara ehtiyaci tamamile aradan qaldirir.

@ObservedObject ve @StateObject: xarici melumatlar

@ObservedObject — kenardan ötürülen ObservableObject numunesini mushahide etmek üchün Property Wrapper-dir. Gorunush bu obyektin sahibi deyil — o, valideyn komponentde yaradilir ve ya Environment vasitesile inject edilir. ObservableObject daxilinde her hansi @Published xassesi deyishdikde, SwiftUI @ObservedObject vasitesile abune olan bütün gorunushleri yeniden chekir.

@StateObject — birbasha gorunushde ObservableObject yaratmaq ve sahib olmaq üchün sargidir. @ObservedObject-den ferqli olaraq, @StateObject obyektin gorunushün bütün heyat dövru erzinde yegane numunesini temin edir. SwiftUI gorunush strukturunu yeniden yaratsa bele (tez-tez bash verir), @StateObject mövcud obyekti saxlayir ve initizalizatoru tekrar cagirmir.

swift
class UserSettings: ObservableObject {
    @Published var username: String = "Guest"
}

struct ProfileView: View {
    @StateObject var settings = UserSettings()

    var body: some View {
        ChildProfileView(settings: settings)
    }
}

struct ChildProfileView: View {
    @ObservedObject var settings: UserSettings

    var body: some View {
        Text("Salam, \(settings.username)")
    }
}

Numunede ProfileView @StateObject vasitesile UserSettings yaradir, obyektin sahibi olur. ChildProfileView eyni numuneni @ObservedObject vasitesile alir — mushahide edir, lakin heyat dövrunu idare etmir. username deyishdikde her iki gorunush yenilenir. Eger ChildProfileView @ObservedObject evezine @StateObject istifade etseydi, her renderde ilkin deyerle yeni numune yaranardi.

Esas qayda: @StateObject obyekti yaradan gorunushde (heqiqet menbeyi), @ObservedObject ise hazir obyekti valideynden alan gorunushde tetbiq olunur. Bu qaydanin pozulmasi veziyyetin itirilmesine ve ya gozlenilmez melumat yeniden yaradilmasina getirib cixarir.

Oz Property Wrapper-inizi yaratmaq

Swift istenilen tekrarlanan xasseye giris mentiqi üchün ferdi Property Wrappers yaratmaga imkan verir. @propertyWrapper atributu olan strukturu ve ya sinfi elan etmek ve wrappedValue-ni heyata kecirmek kifayetdir. Ashagida UserDefaultsWrapper sargisi gosterilib, deyeri avtomatik olaraq UserDefaults ile sinxronlashdirir.

swift
@propertyWrapper
struct UserDefaultsWrapper<T> {
    let key: String
    let defaultValue: T

    var wrappedValue: T {
        get { UserDefaults.standard.object(forKey: key) as? T ?? defaultValue }
        set { UserDefaults.standard.set(newValue, forKey: key) }
    }
}

struct AppConfig {
    @UserDefaultsWrapper(key: "theme", defaultValue: "light")
    var theme: String
}

UserDefaultsWrapper sargisi UserDefaults terefinden desteklenen istenilen tip ile ishlemek üchün generik T-den istifade edir. Getter deyeri achar vasitesile oxuyur, setter yazir. @UserDefaultsWrapper(key:defaultValue:) tetbiqi theme xassesini avtomatik olaraq yaddashla elaqelendirir — UserDefaults ile ishin bütün mentiqi sargi daxilinde gizlenib. Bu, Property Wrappers vasitesile sablon kodunun azaldilmasinin tipik numunesidir.

Ferdi sargilar yaradarken performansi nezere almaq vacibdir. Getter ve setter xasseye her girişde cagirildigi üchün wrappedValue-de agir I/O emeliyyatlari yerleshdirilmemelidir. Asinxron melumat saxlanmasi üchün Property Wrappers-i ObservableObject ve @Published ile birleshdirmek daha yaxshidir.

Tez-tez verilen suallar

@State ve @StateObject arasinda ferq nedir?

@State sade tipler (String, Int, Bool) ve strukturlar üchün nezerde tutulub, @StateObject ise ObservableObject heyata keciren referans tipleri üchün. @State deyeri birbasha SwiftUI-de saxlayir, @StateObject sinif numunesini yiginda idare edir.

@Binding-i @State olmadan istifade etmek olarmi?

Beli, @Binding @StateObject, @ObservedObject ve ya diger Binding-den $ proyeksiyasi vasitesile yaradila biler. Binding hemcinin ObservableObject-den $object.$publishedProperty ve ya InlineBinding-den Binding.constant(value) vasitesile initizallashdirilir.

Butun tetbiqde istifade olunan melumatlar üchün hansi Property Wrapper sechilmelidir?

Qlobal melumatlar üchün @EnvironmentObject istifade edin ve ya ObservableObject-i EnvironmentValues vasitesile inject edin. @StateObject sonraki ötürme ile @ObservedObject vasitesile ushaq komponentlere kok gorunush üchün uygundur.

Niye @ObservedObject melumatlari yeniden yarada biler?

@ObservedObject obyekte sahib deyil — valideyn gorunush yeniden yaradilarsa ve yeni numune ötürerse, @ObservedObject ona kechid eder. Veziyyet itkisinin qarshisini almaq üchün sahib olan gorunush @StateObject istifade etmelidir.

Asinxron emeliyyatlar üchün Property Wrapper yaratmaq olarmi?

Beli, lakin sinif daxilinde @Published ve async funksiyalari ile ObservableObject kombinasiyasindan istifade etmek daha asandir. Property Wrapper tebietce sinxrondur — wrappedValue her girişde hesaplanir, bu uzunmüddetli emeliyyatlar üchün uygun deyil.

Netice

  • Property Wrapper — kod tekrarlanmadan xasselere giris mentiqini inkapsulasiya etmek üchün Swift 5.1 sintaktik konstruksiyasi
  • @State — sade tipler üchün lokal veziyyet, deyishiklikde gorunushü avtomatik yeniden chekir
  • @Binding — sahiblik olmadan valideyn gorunushün melumatlarina referans, $ proyeksiyasi vasitesile elçatandir
  • @StateObject — heyat dövru erzinde yegane numune zemaneti ile ObservableObject sahibliyi
  • @ObservedObject — valideyn komponentden ötürülen ObservableObject mushahidesi
  • @Environment — SwiftUI muhitinin sistem obyektlerine giris
  • Ferdi sargilar @propertyWrapper atributu ve wrappedValue heyata kecirmesi ile yaradilir

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