Published on

SwiftUI-da AppStorage — ma'lumotlarni ilovada saqlash

Authors

Bu videoda biz @AppStorage ni o'rganamiz. Bu SwiftUI-dagi juda qulay property wrapper bo'lib, kichik ma'lumotlarni ilovada doimiy saqlash imkonini beradi — foydalanuvchi ilovani yopib qayta ochsa ham ma'lumotlar saqlanib qoladi.

UIKit bilan tanish bo'lsangiz — bu UserDefaults-ning SwiftUI versiyasi.


Muammo — @State ma'lumotni saqlamaydi

struct AppStorageBootcamp: View {

    @State var currentUserName: String? = nil

    var body: some View {
        VStack(spacing: 20) {
            // nil bo'lsa "Ism qo'shing" ko'rsatiladi
            Text(currentUserName ?? "Ism qo'shing")

            Button("SAQLASH".uppercased()) {
                currentUserName = "Nick"
            }
        }
    }
}

Bu ishlaydi — "Saqlash" bosilganda currentUserName "Nick" ga o'zgaradi. Lekin ilovani yopib qayta ochsangiz — yana "Ism qo'shing" ko'rinadi. @State faqat ilova ishlab turgan vaqtda saqlanadi.


Optional String bilan xavfsiz ishlash

Optional o'zgaruvchini Text ichida ishlatishning ikki xavfsiz usuli:

// 1-usul: ?? operatori — nil bo'lsa standart qiymat
Text(currentUserName ?? "Ism qo'shing")

// 2-usul: if let — nil bo'lsa text umuman ko'rinmaydi
if let name = currentUserName {
    Text(name)
}

// ❌ HECH QACHON BUNDAY QILMANG — crash bo'ladi!
Text(currentUserName!)

UserDefaults — doimiy saqlashning asosi

@AppStorage-ni tushunish uchun avval UserDefaults nima ekanini bilish kerak. Bu — qurilmada kichik ma'lumotlarni saqlash uchun maxsus mini-ma'lumotlar ombori. Kalit-qiymat (key-value) tizimida ishlaydi.

Button("SAQLASH".uppercased()) {
    let name = "Nick"
    currentUserName = name

    // UserDefaults-ga saqlash — "name" kaliti ostida
    UserDefaults.standard.set(name, forKey: "name")
}

Ilova qayta ochilganda saqlangan qiymatni olish:

.onAppear {
    // "name" kaliti ostida saqlangan qiymatni olish
    currentUserName = UserDefaults.standard.string(forKey: "name")
}

Bu ishlaydi, lekin har safar saqlash va olish uchun qo'shimcha kod yozish kerak. @AppStorage buni avtomatik qiladi.


@AppStorage — UserDefaults-ning SwiftUI versiyasi

@AppStorage ishlatganda saqlash va olishni o'zimiz yozishimiz shart emas — barchasi avtomatik:

struct AppStorageBootcamp: View {

    // "name" — UserDefaults dagi kalit
    // Qiymat o'zgarganda avtomatik saqlanadi
    // Ilova qayta ochilganda avtomatik yuklanadi
    @AppStorage("name") var currentUserName: String?

    var body: some View {
        VStack(spacing: 20) {
            Text(currentUserName ?? "Ism qo'shing")

            Button("SAQLASH".uppercased()) {
                // Faqat o'zgaruvchini yangilash yetarli
                // UserDefaults-ga saqlash avtomatik bo'ladi
                currentUserName = "Emily"
            }
        }
    }
}

@State va @AppStorage taqqoslab:

// @State — faqat ilova ishlab turganida saqlanadi
@State var currentUserName: String? = nil

// @AppStorage — ilovani yopib-ochganda ham saqlanadi
@AppStorage("name") var currentUserName: String?

@AppStorage bilan UserDefaults.standard.set(...) va onAppear { ... } kodlari umuman kerak emas.


UserDefaults qanday turlarni saqlaydi?

// String
@AppStorage("user_name") var userName: String?

// Bool
@AppStorage("is_premium") var isPremium: Bool = false

// Int
@AppStorage("login_count") var loginCount: Int = 0

// Double
// @AppStorage("score") var score: Double = 0.0

Qachon ishlatish va qachon emas?

// ✅ AppStorage uchun mos:
// - Foydalanuvchi ismi, ID
// - Premium holati
// - Oxirgi kirish vaqti
// - Ilova sozlamalari (dark mode, til)
// - Onboarding ko'rsatilganmi yo'qmi

// ❌ AppStorage uchun mos emas:
// - Katta ma'lumotlar — fotosuratlar, fayllar
// - Ko'p elementli ro'yxatlar
// - Murakkab ob'ektlar
// Bular uchun Core Data yoki boshqa ma'lumotlar ombori ishlating

AppStorage-ni istalgan ekranda ishlatish

@AppStorage-ning kuchli tomoni — bir xil kalit ishlatilsa, ilovaning istalgan ekranida bir xil ma'lumotga kirish mumkin:

// 1-ekran
struct ScreenOne: View {
    @AppStorage("name") var currentUserName: String?

    var body: some View {
        Button("Ismni saqlash") {
            currentUserName = "Nick"
        }
    }
}

// 2-ekran — bir xil "name" kaliti bilan
struct ScreenTwo: View {
    @AppStorage("name") var currentUserName: String?

    var body: some View {
        // 1-ekranda saqlangan ismni ko'rsatadi
        Text(currentUserName ?? "Ism yo'q")
    }
}

Bir ekranda saqlangan ma'lumot — boshqa ekranda avtomatik mavjud. @EnvironmentObject kabi uzatishga hojat yo'q.


To'liq misol

struct AppStorageBootcamp: View {

    @AppStorage("name") var currentUserName: String?

    var body: some View {
        VStack(spacing: 20) {

            if let name = currentUserName {
                Text(name)
                    .font(.title)
            } else {
                Text("Ism qo'shing")
                    .font(.title)
                    .foregroundColor(.gray)
            }

            Button("Nick sifatida saqlash".uppercased()) {
                currentUserName = "Nick"
            }

            Button("Emily sifatida saqlash".uppercased()) {
                currentUserName = "Emily"
            }

            Button("O'chirish".uppercased()) {
                currentUserName = nil
            }
        }
    }
}

Xulosa

@StateUserDefaults@AppStorage
Ilovada saqlanadiHaHaHa
Yopib-ochganda saqlanadiYo'qHaHa
Yozish qulayligiEng osonQo'shimcha kod kerakOson
SwiftUI bilan integratsiyaTo'liqQo'ldaTo'liq

@AppStorage — kichik ma'lumotlarni doimiy saqlash uchun eng qulay SwiftUI vositasi. Foydalanuvchi tizimga kirish holati, ilova sozlamalari va shunga o'xshash kichik ma'lumotlar uchun ideal.

Buy mea coffee