@State — bu nima, maqsadi va SwiftUI-da qo'llanilishi

Muallif: IT Sectr Nashr etilgan: 2026-06-19 O'qish vaqti: 7 daq

@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 — bir ko'rinishga tegishli lokal holat uchun Property Wrapper
  • Avtomatik yangilash — SwiftUI @State xususiyati o'zgarganda body-ni qayta ishga tushiradi
  • Oddiy turlar — @State String, Int, Bool, enum va strukturalar uchun mos
  • Ichma-ich ko'rinishlarga uzatmang — bola komponentlardan o'zgartirish uchun @Binding dan foydalaning
  • private — @State xususiyatlari har doim private modifikatori bilan e'lon qilinadi

SwiftUI-da @State nima?

@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.

@State ichki tarzda qanday ishlaydi?

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.

swift
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.

Loyihada @State qachon ishlatiladi

@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.

  • Matn maydonlari — TextField-ga kiritilgan matnni saqlash uchun @State
  • Boolean bayroqlar — modal oynalar va sheet-larni ko'rsatish/yashirish uchun @State
  • Element tanlash — tanlangan tab yoki qatorni kuzatish uchun @State
  • Hisoblagichlar — oshirish/kamaytirish bilan raqamli qiymatlar uchun @State
  • Oraliq hisob-kitoblar — ko'rinish ichida natijalarni keshlash uchun @State

@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.

@State va @Binding: birgalikda ishlash

@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.

swift
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.

@State bilan ishlashda odatiy xatolar

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.

SwiftUI-da @State qo'llanilishiga misollar

@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.

swift
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

Nega @State private bilan e'lon qilinadi?

@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.

@State massiv yoki lug'at saqlay oladimi?

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.

Optional turidagi @State xususiyatiga nil tayinlanganda nima bo'ladi?

@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 qayta paydo bo'lganda qanday harakat qiladi?

@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.

@State o'zgarishlarini animatsiya qilish mumkinmi?

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

  • @State — bir ko'rinishning lokal holati uchun Property Wrapper, interfeysni avtomatik yangilaydi
  • Mos keladi oddiy turlar uchun: String, Int, Bool, shuningdek strukturalar va enumlar
  • Mos kelmaydi malumot turlari (sinflar) uchun — @StateObject dan foydalaning
  • Har doim private — holat tashqaridan to'g'ridan-to'g'ri o'zgartirilmasligi kerak
  • $ proyeksiyasi — o'zgartirish huquqini bola ko'rinishlarga uzatish uchun Binding yaratadi
  • Bir nechta @State bir ko'rinishda — mustaqil holatlar uchun odatiy amaliyot
  • withAnimation — @State xususiyatlari o'zgarishlarini animatsiya qilish imkonini beradi

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.

Loyihani muhokama qilish

Shuningdek o'qing