SwiftUI da @AppStorage — bu nima, UserDefaults va sozlamalarni saqlash

Muallif: IT Sectr Nashr etilgan: 2026-06-25 O'qish vaqti: 7 daq

@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 — SwiftUI da UserDefaults bilan reaktiv ishlash uchun property wrapper
  • Avtomatik saqlash — qiymat har o‘zgarishda UserDefaults ga yoziladi
  • Avtomatik yangilash UI — View istalgan manbadan UserDefaults o‘zgarganda qayta chiziladi
  • Qo‘llab-quvvatlanadigan turlar: String, Int, Double, Bool, Data, URL va opsional versiyalar
  • Standart qiymat e’londa ko‘rsatiladi va birinchi ishga tushirishda ishlatiladi

SwiftUI da @AppStorage nima?

@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 vs UserDefaults: taqqoslash

@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@AppStorageUserDefaults
ReaktivlikAvtomatikBildirishnomalarga obuna talab qiladi
BoilerplateXususiyat uchun 1 qatorXususiyat uchun 15–20 qator
TurlarString, Int, Double, Bool, Data, URLBarcha turlar + arxiv obyektlari
Maxsus turlarRawRepresentable orqaliNSKeyedArchiver orqali
App ExtensionAvtomatik sinxronizatsiyaQo‘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.

Qo‘llab-quvvatlanadigan ma’lumot turlari

@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.

swift
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.

Store o‘zgarishlarini kuzatish

@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.

swift
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.

@AppStorage kod misollari

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.

swift
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.

@AppStorage ni App Group bilan sinxronlash

swift
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

@AppStorage va @State o‘rtasidagi farq nima?

@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.

@AppStorage Enum bilan ishlatilishi mumkinmi?

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.

Barcha @AppStorage qiymatlarini qanday tozalash mumkin?

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.

@AppStorage App Extensions bilan ishlaydimi?

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 da qancha ma’lumot saqlash mumkin?

@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

  • @AppStorage — UserDefaults da sozlamalarni reaktiv saqlash uchun property wrapper
  • Avtomatik saqlash va istalgan manbadan qiymat o‘zgarganda UI ni avtomatik yangilash
  • Qo‘llab-quvvatlaydi String, Int, Double, Bool, Data, URL va RawRepresentable enums
  • Standart qiymat e’londa ko‘rsatiladi va birinchi ishga tushirishda tiklanadi
  • App Group @AppStorage ni ilova va kengaytmalar o‘rtasida sinxronlash imkonini beradi
  • UserDefaults faqat kichik hajmdagi ma’lumotlar uchun mos — 100 KB gacha
  • Ishlating @AppStorage ni foydalanuvchi sozlamalari uchun, @State ni ekranning vaqtinchalik holatlari uchun

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.

Loyihani muhokama qilish

Shuningdek o'qing