Published on

@AppStorage bilan foydalanuvchi sozlamalari

Authors

@AppStorage β€” SwiftUI da UserDefaults ni o'qish va yozishning eng tabiiy usuli. UserDefaults ni iOS ilovangiz uchun saqlaydigan kichik daftar sifatida tasavvur qiling: kalitga qiymat yozasiz, ilova yopilsa ham u shu yerda qoladi.

@AppStorage ning eng yaxshi tomoni β€” @State ga o'xshashligi. Xususiyat e'lon qilasiz, o'qiysiz, yozasiz va SwiftUI qiymat o'zgarganda ko'rinishni avtomatik yangilaydi. Farqi: qiymat diskda, RAMda emas.

Swift
SettingsView.swift
import SwiftUI struct SettingsView: View { // UserDefaults ga "isDarkMode" kaliti ostida yozadi va o'qiydi @AppStorage("isDarkMode") var isDarkMode: Bool = false // Foydalanuvchi tanlagan foydalanuvchi nomini saqlaydi @AppStorage("username") var username: String = "" // Shrift o'lchamini saqlaydi β€” standart 16 @AppStorage("fontSize") var fontSize: Int = 16 var body: some View { Form { Section("Ko'rinish") { // Toggle o'zgarishda UserDefaults ga darhol yozadi Toggle("Qorong'u rejim", isOn: $isDarkMode) } Section("Profil") { // TextField UserDefaults ga terilgan sari yozadi TextField("Ismingiz", text: $username) // Stepper Int qiymatni o'zgartiradi Stepper("Shrift: (fontSize)", value: $fontSize, in: 12...24) } Section("Ko'rish") { if !username.isEmpty { Text("Xush kelibsiz, (username)!") .foregroundStyle(.secondary) } Text("Shrift o'lchami: (fontSize)pt") .font(.system(size: CGFloat(fontSize))) } } // isDarkMode qiymatiga qarab rejimni o'rnatadi .preferredColorScheme(isDarkMode ? .dark : .light) .navigationTitle("Sozlamalar") } }
QatorVazifasi
@AppStorage("isDarkMode") var isDarkMode: Bool = false"isDarkMode" kalit ostida UserDefaults ga bog'langan xususiyat. false β€” faqat birinchi marta, UserDefaults da qiymat yo'q bo'lsa ishlatiladi.
Toggle("...", isOn: $isDarkMode)Toggle ni @AppStorage ga bevosita bog'laydi. Foydalanuvchi ulaganda qiymat darhol UserDefaults ga yoziladi.
.preferredColorScheme(isDarkMode ? .dark : .light)isDarkMode ni o'qib ko'rinish uchun rejim o'rnatadi. @AppStorage @State kabi ishlaydi β€” qiymat o'zgarganda ko'rinish qayta renderlanadi.

@AppStorage patternlari

// Bool β€” onboarding yoki bayroqlar uchun
@AppStorage("hasCompletedOnboarding") var hasCompletedOnboarding: Bool = false

Button("Boshlash") {
    hasCompletedOnboarding = true  // Darhol UserDefaults ga yoziladi
}
// String β€” ism yoki mavzu nomi uchun
@AppStorage("displayName") var displayName: String = ""

if !displayName.isEmpty {
    Text("Xush kelibsiz, \(displayName)!")
}
// Enum β€” RawRepresentable bo'lishi shart
enum IlovaRejimi: String {
    case yorug, qorong, tizim
}

@AppStorage("rejim") var rejim: IlovaRejimi = .tizim
// Xom String qiymati ("yorug", "qorong", "tizim") UserDefaults ga yoziladi

@AppStorage nima uchun emas

UserDefaults kichik, oddiy qiymatlar uchun mo'ljallangan. Bu narsalarni saqlamang:

// ❌ Yomon β€” massivni @AppStorage da saqlashga urinish
@AppStorage("tasks") var tasksJSON: String = "[]"
// JSON encode/decode qo'lda qilish kerak β€” og'ir va xato qilishi mumkin

// βœ… To'g'ri β€” SwiftData to'plamlar uchun yaratilgan
@Query var tasks: [Task]

Qoida: Sozlamalar ekranida ko'rsatadigan narsa bo'lsa β€” @AppStorage to'g'ri tanlov. Yozuvlar ro'yxati bo'lsa β€” SwiftData.

Tezkor ma'lumotnoma

SintaksisVazifasi
@AppStorage("kalit") var x: Bool = falseBool ni UserDefaults ga saqlaydi
@AppStorage("kalit") var x: String = ""String ni saqlaydi β€” bo'sh satr standart
@AppStorage("kalit") var x: Int = 0Int ni saqlaydi
@AppStorage("kalit") var x: Double = 0.0Double ni saqlaydi
$x binding da@State kabi β€” kontrolga bevosita bog'lash
x = yangiQiymatUserDefaults ga darhol yozadi, ko'rinishni yangilaydi

🎯 Topshiriq: doimiy sozlamalar ekrani

Kamida uchta @AppStorage xususiyati bilan sozlamalar ekrani yarating: Bool toggle, String text field va Int stepper. Saqlangan qiymatlarni alohida viewda ko'rsating. Simulyatorda ilovani to'liq yoping (Device > Restart yoki App Switcher dan), qayta oching va uchala qiymat ham saqlanganligini tasdiqlang.

Buy mea coffee