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 — 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.
@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.
@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
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.
| Wrapper | Teyinat | Sahiblik |
|---|---|---|
| @State | Bir gorunushun lokal veziyyeti | Cari gorunush |
| @Binding | Valideyn ile ikiterefli elaqe | Valideyn gorunush |
| @ObservedObject | Xarici obyektin mushahidesi | Xarici sahib |
| @StateObject | ObservableObject yaradilmasi | Cari gorunush |
| @Environment | Iyerarxiyadan sistem deyerleri | SwiftUI 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 — 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.
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 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.
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 — 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.
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.
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.
@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 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.
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.
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.
@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.
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
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