@AppStorage SwiftUI da — UserDefaults bilan ishlash uchun property wrapper bo‘lib, qiymatni UI bilan avtomatik sinxronlashtiradi. @AppStorage orqali e’lon qilingan xususiyat o‘zgarganda, yangi qiymat darhol UserDefaults da saqlanadi va UserDefaults tashqaridan — vidjet yoki kengaytma tomonidan o‘zgartirilganda — View avtomatik ravishda qayta chiziladi. Apple Developer Documentation (2025) ga ko‘ra, @AppStorage String, Int, Double, Bool, Data, URL va ularning opsional versiyalarini qo‘llab-quvvatlaydi, qo‘lda kuzatish kodekisiz reaktiv foydalanuvchi sozlamalarini saqlashni ta’minlaydi.
Asosiy ma’lumotlar
@AppStorage — Apple tomonidan iOS 14 da taqdim etilgan, View xususiyatini UserDefaults dagi kalit bilan bog‘laydigan property wrapper. Xususiyat o‘qilganda, SwiftUI ko‘rsatilgan kalit bo‘yicha UserDefaults dan qiymatni yuklaydi. Yozishda — yangi qiymatni saqlaydi va View ni qayta chizish zarurligi haqida xabar beradi.
@AppStorage paydo bo‘lishidan oldin, dasturchilar qo‘lda UserDefaults ni onAppear da o‘qishlari, UserDefaults.didChangeNotification bildirishnomasiga obuna bo‘lishlari va o‘zgarishlarda @State ni yangilashlari kerak edi. @AppStorage butun siklni avtomatlashtiradi: bir qatordagi e’lon 15–20 qator boilerplate kodni almashtiradi. Bundan tashqari, @AppStorage ikki tomonlama sinxronizatsiyani ta’minlaydi — agar UserDefaults qiymati boshqa jarayondan (masalan, App Extension yoki Widget) o‘zgartirilsa, View baribir yangilanishni oladi.
Arxitektura nuqtai nazaridan, @AppStorage DynamicProperty sifatida amalga oshirilgan bo‘lib, bu SwiftUI ga bog‘liqliklarni kuzatish va kuzatilgan qiymat o‘zgarganda View ni qayta chizish imkonini beradi. Bu uni foydalanuvchi sozlamalarini saqlash uchun ideal qiladi: interfeys tili, funksiyalarni yoqish/o‘chirish, oxirgi tanlangan tab, foydalanuvchi nomi.
@AppStorage UserDefaults dan foydalansa ham, xotira bilan ishlash yondashuvlari tubdan farq qiladi. UserDefaults — past darajadagi API bo‘lib, o‘qish, yozish va o‘zgarish bildirishnomalarini qo‘lda boshqarishni talab qiladi. @AppStorage — qutidan chiqqandek reaktiv xatti-harakatni ta’minlovchi SwiftUI abstraksiyasi.
UserDefaults bir martalik operatsiyalar uchun mos keladi: ilova ishga tushganda sozlamalarni yuklash, analitika yozish, tokenlarni keshlash. @AppStorage — UI ni reaktiv yangilashi kerak bo‘lgan sozlamalar uchun: mavzu kalitlari, til tanlash, interfeys holatini saqlash. UserDefaults ni to‘g‘ridan-to‘g‘ri View ichida ishlatish — anti-na’munadir, chunki View qo‘shimcha obuna bo‘lmasdan o‘zgarishlardan xabar topmaydi.
| Parametr | @AppStorage | UserDefaults |
|---|---|---|
| Reaktivlik | Avtomatik | Bildirishnomalarga obuna talab qiladi |
| Boilerplate | Xususiyat uchun 1 qator | Xususiyat uchun 15–20 qator |
| Turlar | String, Int, Double, Bool, Data, URL | Barcha turlar + arxiv obyektlari |
| Maxsus turlar | RawRepresentable orqali | NSKeyedArchiver orqali |
| App Extension | Avtomatik sinxronizatsiya | Qo‘lda obuna |
Reaktiv UI li oddiy sozlamalar uchun @AppStorage afzal tanlovdir. Murakkab ma’lumotlar (massivlar, lug‘atlar, maxsus obyektlar) uchun UserDefaults ni @State va qo‘lda o‘zgarish obunasi bilan birga ishlating yoki tuzilgan saqlash uchun SwiftData / Core Data ga o‘ting.
@AppStorage UserDefaults to‘g‘ridan-to‘g‘ri seriyalashtira oladigan standart turlarni qo‘llab-quvvatlaydi: String, Int, Double, Bool, Data, URL. Har bir tur uchun opsional versiya mavjud (String?, Int?, Double?, Bool?, Data?, URL?), “o‘rnatilmagan” va “bo‘sh qiymat” ni farqlash imkonini beradi.
RawRepresentable protokoliga mos maxsus turlarni saqlash uchun @AppStorage avtomatik ishlaydi. Agar enum rawValue turi String yoki Int bo‘lsa, uni to‘g‘ridan-to‘g‘ri ishlatish mumkin: @AppStorage("theme") var theme: AppTheme = .system. SwiftUI avtomatik ravishda qiymatni rawValue orqali seriyalashtiradi/deseriyalashtiradi.
enum AppTheme: String {
case system, light, dark
}
struct SettingsView: View {
@AppStorage("username") var username: String = "Guest"
@AppStorage("launchCount") var launchCount: Int = 0
@AppStorage("isDarkMode") var isDarkMode: Bool = false
@AppStorage("appTheme") var theme: AppTheme = .system
@AppStorage("lastOpened") var lastOpened: Date? = nil
var body: some View {
Form {
TextField("Username", text: $username)
Toggle("Dark mode", isOn: $isDarkMode)
Text("\(launchCount) marta ishga tushirildi")
}
}
}
Misolda turli xil @AppStorage turlari ishlatilgan: standart qiymati “Guest” bo‘lgan String, ishga tushirish hisoblagichi uchun Int, qorong‘u mavzu uchun Bool, rawValue turi String bo‘lgan enum AppTheme va oxirgi ochilish vaqti uchun opsional Date?. Har bir xususiyat birinchi argumentda ko‘rsatilgan UserDefaults kalitiga bog‘langan. Standart qiymat birinchi ishga tushirishda kalit mavjud bo‘lmasa ishlatiladi.
@AppStorage ning asosiy afzalliklaridan biri — UserDefaults o‘zgarishlarini istalgan manbadan avtomatik kuzatishdir. Agar App Extension yoki Widget qiymatni o‘zgartirsa, asosiy ilovadagi @AppStorage bildirishnoma oladi va View ni qayta chizadi. Bunga @AppStorage ning UserDefaults.didChangeNotification ga avtomatik o‘rnatadigan KVO (Key-Value Observing) mexanizmi orqali erishiladi.
Amalda bu shuni anglatadiki, agar foydalanuvchi Widget da sozlamani o‘zgartirsa (masalan, qorong‘u mavzuni yoqsa), ilova darhol bu o‘zgarishni qabul qiladi. Xuddi shunday asosiy ilova, Share Extension, Watch App va Today Widget o‘rtasida sinxronizatsiya ishlaydi. Dasturchi jarayonlararo ma’lumot almashinuvi uchun kod yozishi shart emas — @AppStorage buni avtomatik qiladi.
struct ThemeSettingView: View {
@AppStorage("isDarkMode") var isDarkMode: Bool = false
var body: some View {
VStack {
Toggle("Dark Mode", isOn: $isDarkMode)
.onChange(of: isDarkMode) { oldValue, newValue in
print("Qorong‘u rejim \(newValue) ga o‘zgartirildi")
}
}
}
}
Toggle @AppStorage orqali $isDarkMode bilan bog‘langan. O‘zgartirilganda, qiymat avtomatik ravishda UserDefaults da “isDarkMode” kaliti ostida saqlanadi. .onChange modifikatori o‘zgarish vaqtida qo‘shimcha harakatni bajarishga imkon beradi — masalan, analitika yuborish yoki boshqa ekranlar UI sini yangilash. Agar Widget bir xil kalitni o‘zgartirsa, @AppStorage onChange ni ham chaqiradi, holatning izchilligini ta’minlab.
Barcha konfiguratsiyalarni saqlash uchun @AppStorage dan foydalanadigan to‘liq ilova sozlamalari ekranini ko‘rib chiqaylik. Forma turli xil sozlama turlariga ega bo‘limlarni o‘z ichiga oladi: matn maydonlari, kalitlar, hisoblagichlar — barcha qiymatlar avtomatik ravishda UserDefaults da saqlanadi.
struct AppSettingsView: View {
@AppStorage("displayName") var displayName = ""
@AppStorage("notificationsEnabled") var notificationsEnabled = true
@AppStorage("maxResults") var maxResults = 25
@AppStorage("selectedTab") var selectedTab = "home"
var body: some View {
NavigationStack {
Form {
Section(header: Text("Profil")) {
TextField("Display name", text: $displayName)
}
Section(header: Text("Sozlamalar")) {
Toggle("Enable notifications",
isOn: $notificationsEnabled)
Stepper("Max results: \(maxResults)",
value: $maxResults,
in: 10...100,
step: 5)
}
Section {
Button("Sozlamalarni tiklash") {
UserDefaults.standard.removePersistentDomain(
forName: Bundle.main.bundleIdentifier!)
}
.tint(.red)
}
}
.navigationTitle("Settings")
}
}
}
Formada turli turdagi to‘rtta @AppStorage xususiyati mavjud: nom uchun String, bildirishnomalar uchun Bool, natijalar soni uchun Int va tanlangan tab uchun String. Barcha boshqaruv elementlari Binding orqali xususiyatlarga bog‘langan ($displayName, $notificationsEnabled va h.k.). “Reset settings” tugmasi barcha UserDefaults ni tiklaydi, ilova domenini o‘chiradi — shundan so‘ng @AppStorage avtomatik ravishda standart qiymatlarga qaytadi.
struct SharedSettingsView: View {
let sharedDefaults = UserDefaults(suiteName: "group.com.example.app")
@AppStorage("widgetTheme", store: UserDefaults(suiteName: "group.com.example.app")!)
var widgetTheme: String = "tizim"
@AppStorage("widgetColor", store: UserDefaults(suiteName: "group.com.example.app")!)
var widgetColor: String = "ko‘k"
var body: some View {
Form {
Picker("Widget theme", selection: $widgetTheme) {
Text("Tizim").tag("system")
Text("Yorug‘").tag("yorug‘")
Text("Qorong‘u").tag("qorong‘u")
}
Picker("Accent color", selection: $widgetColor) {
Text("Ko‘k").tag("blue")
Text("Yashil").tag("yashil")
Text("Qizil").tag("qizil")
}
}
}
}
App Group (ilova va kengaytmalar o‘rtasidagi umumiy xotira) uchun @AppStorage store parametrini qabul qiladi: UserDefaults(suiteName:). Qiymatlar asosiy ilova, Widget, Watch App va bir guruhning boshqa kengaytmalari uchun mavjud bo‘lgan umumiy konteynerda saqlanadi. Widget bu sozlamalarni o‘qiy oladi va ilovada o‘zgarish bo‘lganda, Widget UserDefaults kuzatish mexanizmi orqali avtomatik yangilanadi.
Tez-tez beriladigan savollar
@State qiymatni faqat xotirada saqlaydi va ilova qayta ishga tushganda tiklanadi. @AppStorage qiymatni UserDefaults da saqlaydi va keyingi ishga tushirishda tiklaydi. @State ni ekranning vaqtinchalik ma’lumotlari uchun, @AppStorage ni esa qayta ishga tushirishda saqlanib qolishi kerak bo‘lgan sozlamalar uchun ishlating.
Ha, agar Enum rawValue turi String yoki Int bo‘lgan RawRepresentable protokolini amalga oshirsa. Misol: @AppStorage("theme") var theme: AppTheme = .system. SwiftUI avtomatik ravishda enum ni rawValue orqali seriyalashtiradi va yuklashda tiklaydi.
Standart xotira uchun UserDefaults.standard.removePersistentDomain(forName: Bundle.main.bundleIdentifier!) yoki ma’lum kalit uchun removeObject(forKey:) ni chaqiring. Tozalashdan so‘ng barcha @AppStorage xususiyatlari e’londa ko‘rsatilgan standart qiymatlarga qaytadi.
Ha, ilova va kengaytmalar o‘rtasida sinxronlash uchun App Group dan foydalaning: @AppStorage("key", store: UserDefaults(suiteName: "group.com.example.app")!). Widget, Share Extension va Watch App bir xil UserDefaults da o‘qishi va yozishi mumkin, o‘zgarishlar esa avtomatik kuzatiladi.
@AppStorage kichik hajmdagi ma’lumotlar uchun mo‘ljallangan UserDefaults dan foydalanadi: sozlamalar, tokenlar, hisoblagichlar. Tavsiya etilgan chegara — ilova uchun 100 KB gacha. Tuzilgan yoki katta ma’lumotlar (obyekt massivlari, media fayllar) uchun SwiftData, Core Data yoki fayl tizimidan foydalaning.
Xulosa
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.