- 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.
Rahmat, men Nick, bu Swiftful Thinking va keyingi videoda ko'rishguncha!