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.

Rahmat, men Nick, bu Swiftful Thinking va keyingi videoda ko'rishguncha!

Buy mea coffee