- Published on
SwiftUI-da AppStorage — ma'lumotlarni ilovada saqlash
- Authors
- Name
- ShoxruxC
- @iOSdasturchi
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
@State | UserDefaults | @AppStorage | |
|---|---|---|---|
| Ilovada saqlanadi | Ha | Ha | Ha |
| Yopib-ochganda saqlanadi | Yo'q | Ha | Ha |
| Yozish qulayligi | Eng oson | Qo'shimcha kod kerak | Oson |
| SwiftUI bilan integratsiya | To'liq | Qo'lda | To'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.