@State — SwiftUI-da bitta ko'rinish ichida lokal holatni boshqarish uchun Property Wrapper. SwiftUI @State xususiyati har o'zgarishida ko'rinishni avtomatik ravishda qayta chizadi va interfeysni qo'lda yangilash chaqiruvlarisiz reaktiv qiladi. Apple Developer Documentation (2025)-ga ko'ra, @State bir ko'rinishga tegishli oddiy turlar va strukturalar uchun tavsiya etiladi. @State — SwiftUI interfeysiga interaktivlik qo'shishning eng oddiy usuli.
Asosiy fikrlar
@State — SwiftUI-ga o'rnatilgan Property Wrapper bo'lib, ko'rinishga o'z holatini saqlash va kuzatish imkonini beradi. @State qiymati o'zgarganda, SwiftUI avtomatik ravishda ko'rinishni qayta chizadi va body xususiyatini qayta chaqiradi. Bu SwiftUI-da reaktiv dasturlashning asosidir: dasturchi holatni e'lon qiladi, framework esa interfeys sinxronizatsiyasini o'z zimmasiga oladi.
@State SwiftUI tomonidan boshqariladigan yig'inda saqlash maydoni yaratadi. Bu maydon barqaror — har bir renderda sodir bo'ladigan ko'rinish strukturasi qayta ishga tushirilishlaridan omon qoladi. SwiftUI @State xususiyatini ma'lum bir ko'rinishga bog'lash uchun ko'rinish identifikatoridan (ierarxiyadagi joylashuv asosida yaratilgan) foydalanadi. Shu tufayli ota-ona ko'rinishi yangilanganda holat qayta tiklanmaydi.
Muhim cheklov: @State faqat qiymat turlari (strukturalar, enums, primitivlar) uchun mo'ljallangan. Malumot turlari (sinflar) uchun @StateObject yoki @ObservedObject dan foydalaning. Agar sinfni @State xususiyatiga tayinlasangiz, SwiftUI obyekt ichidagi o'zgarishlarni aniqlay olmaydi — faqat referansning to'liq almashtirilishini.
SwiftUI @State-ni ichki Storage mexanizmi orqali amalga oshiradi. Har bir @State xususiyati ko'rinishning maxsus storage konteynerida saqlanadigan ajratilgan xotira hujayrasini oladi. wrappedValue-ga yozish sodir bo'lganda, SwiftUI didSet orqali bog'liqlik grafigini (dependency graph) qayta chizish zarurligi haqida xabardor qiladi.
struct ContentView: View {
@State private var name: String = "User"
@State private var isLoggedIn: Bool = false
var body: some View {
VStack {
Text("Salom, \(name)")
Button(isLoggedIn ? "Chiqish" : "Kirish") {
isLoggedIn.toggle()
}
}
}
}
Misolda ikkita @State xususiyati bor: name (String) va isLoggedIn (Bool). isLoggedIn.toggle() chaqirilganda, SwiftUI ContentView-ni yangilash talab qiladigan deb belgilaydi va keyingi render siklida body-ni qayta ishga tushiradi. Asosiy nuqta: @State xususiyatlari har doim private modifikatori bilan e'lon qilinadi — bu holat faqat joriy ko'rinishga tegishli ekanligini va tashqaridan to'g'ridan-to'g'ri o'zgartirilmasligi kerakligini bildiradi.
O'zgarishlarni kuzatish uchun SwiftUI Combine-dan CurrentValueSubject dan foydalanadi. Har bir @State xususiyati har bir o'zgarishda tizimni xabardor qiladigan yashirin noshir yaratadi. Bu SwiftUI-ga ierarxiyaning to'liq yangilanishidan qochib, faqat minimal zarur ko'rinishlar to'plamini qayta chizish imkonini beradi.
@State oddiy lokal holatlar uchun optimal: qidiruv matn maydonlari, modal oynalar uchun boolean bayroqlar, sozlama kalitlari, hisoblagichlar, tanlangan ro'yxat elementlari. Agar qiymat faqat bitta ko'rinishda va uning ichma-ich komponentlarida (@Binding orqali) ishlatilsa, @State to'g'ri tanlovdir. Ko'rinish yopilishidan keyin saqlanishi kerak bo'lgan holatlar (masalan, forma ma'lumotlari) uchun @State mos keladi, ko'rinish ierarxiyada qolsa.
@State-dan global ilova holatlari, tarmoq ma'lumotlarini keshlash yoki bir nechta ekranlarda ishlatiladigan obyektlar uchun foydalanmang. Bu maqsadlar uchun @StateObject va @EnvironmentObject mo'ljallangan. @State katta hajmdagi ma'lumotlarni saqlash uchun ham mos emas — har safar o'zgarganda butun ko'rinish qayta chiziladi.
@Binding — ota-ona ko'rinishidagi @State bilan bu holatni o'zgartirishi kerak bo'lgan bola ko'rinishi o'rtasidagi ko'prik. Ota-ona @State e'lon qiladi, bola komponent esa $ proyeksiyasi orqali Binding oladi. Bola ko'rinishida Binding-ning o'zgarishi avtomatik ravishda ota-onadagi @State-ni yangilaydi — va aksincha. Bu qayta aloqa imkoniyati bilan bir yo'nalishli ma'lumot oqimini ta'minlaydi.
struct ParentView: View {
@State private var text: String = ""
var body: some View {
ChildView(text: $text)
}
}
struct ChildView: View {
@Binding var text: String
var body: some View {
TextField("Enter text", text: $text)
}
}
Listingda ParentView @State text-ning egasi, ChildView esa $text-ni Binding sifatida oladi. ChildView ichidagi TextField text: $text orqali ushbu Binding-ga bog'lanadi. Foydalanuvchi TextField-da yozganda, qiymat ChildView-da Binding orqali o'zgaradi, bu ParentView-da @State-ning yangilanishiga sabab bo'ladi. Ikkala ko'rinish ham yangi qiymat bilan qayta chiziladi.
Eng keng tarqalgan xato — @State xususiyatiga sinf tayinlash. Agar @State var model = MyClass() yozsangiz, SwiftUI sinf ichidagi xususiyatlar o'zgarishlarini kuzata olmaydi — faqat obyektning o'zini almashtirishni. Sinflar uchun har doim @StateObject dan foydalaning. Ikkinchi keng tarqalgan muammo — @State-ni private modifikatorisiz e'lon qilish, bu holat inkapsulyatsiyasi prinsipini buzadi.
@State-ni to'g'ridan-to'g'ri uzatish bola ko'rinishga $ holda — yana bir odatiy xato. Agar TextField(text: $text) o'rniga TextField(text: text) uzatsangiz, bola komponent Binding emas, oddiy string oladi. TextField-dagi matn o'zgarishi ota-ona @State bilan sinxronlashtirilmaydi. Binding uzatish uchun har doim $ proyeksiyasidan foydalaning.
Uchinchi xato — bog'liq ma'lumotlar uchun bir nechta @State xususiyatlari. Agar bir necha qiymat mantiqan bir butunlikni tashkil qilsa (masalan, forma maydonlari), ularni bitta @State bilan bitta strukturada birlashtiring. Bu holatni bola ko'rinishlariga uzatishni soddalashtiradi va alohida yangilanish tetikleyicilari sonini kamaytiradi.
@State aksariyat SwiftUI loyihalarida asosiy interaktivlik uchun qo'llaniladi. @State matn maydonlari va yuklash holatini boshqaradigan kirish formasi misolini ko'rib chiqaylik. Bu naqsh har bir ilovada — oddiy eslatmalardan tortib murakkab korporativ yechimlargacha uchraydi.
struct LoginView: View {
@State private var email: String = ""
@State private var password: String = ""
@State private var isLoading: Bool = false
@State private var errorMessage: String?
var body: some View {
Form {
TextField("Email", text: $email)
SecureField("Password", text: $password)
Button("Kirish") {
login()
}.disabled(isLoading)
}
}
private func login() {
isLoading = true
// Tarmoq so'rovini bajarish
}
}
Misolda to'rtta @State xususiyati bor: email va password forma maydonlari uchun, isLoading yuklash indikatori uchun va errorMessage xatolarni ko'rsatish uchun. Har bir xususiyat interfeysning o'z qismini mustaqil boshqaradi. isLoading o'zgarganda tugma disabled(isLoading) orqali avtomatik bloklanadi — UI-ni qo'lda yangilashsiz.
Tez-tez beriladigan savollar
@State ma'lum bir ko'rinishning lokal holati uchun mo'ljallangan. private modifikatori boshqa komponentlarning uni to'g'ridan-to'g'ri o'zgartirishining oldini oladi, inkapsulyatsiyani buzadi. Tashqi kirish uchun $ proyeksiyasidan foydalaning.
Ha, @State massiv va lug'atlarni qo'llab-quvvatlaydi, chunki ular qiymat turlaridir. Biroq massiv elementini o'zgartirganda SwiftUI butun ko'rinishni qayta chizadi. Katta ro'yxatlar uchun @Published bilan @StateObject dan foydalanish samaraliroq.
@State Optional turlari bilan to'g'ri ishlaydi. Nil tayinlanganda SwiftUI o'zgarishni aniqlaydi va ko'rinishni qayta chizadi. Bu errorMessage: String? kabi holatlar uchun qulay, bu yerda nil xatoning yo'qligini bildiradi.
@State ko'rinish ierarxiyada qolsa, qiymatni saqlaydi. Agar ko'rinish ierarxiyadan olib tashlanib qayta qo'shilsa, @State standart qiymat bilan qayta ishga tushadi. Barqarorlik uchun @AppStorage dan foydalaning.
Ha, o'zgarishni withAnimation bilan o'rab oling: withAnimation(.easeInOut) { isExpanded.toggle() }. SwiftUI belgilangan animatsiya turi bilan interfeysning eski va yangi holati o'rtasidagi o'tishni animatsiya qiladi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.