SwiftUI'da @Environment — bu nima, asosiy tushunchalar va mexanizm

Muallif: IT Sectr Nashr etilgan: 2026-06-25 O'qish vaqti: 8 daq

@Environment SwiftUI'da — View iyerarxiyasi bo'ylab avtomatik tarqatiladigan tizim muhiti qiymatlarini o'qish uchun property wrapper. Komponent rang sxemasiga, locale-ga, shrift o'lchamiga, managedObjectContext-ga va o'nlab boshqa tizim parametrlariga kirish imkonini beradi. Apple Developer Documentation (2025) ga ko'ra, @Environment muhit qiymatidagi har qanday o'zgarish barcha obuna bo'lgan View-larning qayta chizilishiga olib kelishini kafolatlaydi va qo'lda chaqiruvlarsiz interfeysning reaktiv yangilanishini ta'minlaydi.

Asosiy fikrlar

  • @Environment — SwiftUI tizim muhiti qiymatlarini o'qish uchun property wrapper
  • Rang sxemasi, locale va shrift o'lchami — tez-tez ishlatiladigan tizim qiymatlari
  • Har qanday muhit o'zgarishi obuna bo'lgan View-larning avtomatik qayta chizilishiga sabab bo'ladi
  • Maxsus kalitlar EnvironmentKey orqali o'z muhit qiymatlarini yaratishga imkon beradi
  • @Environment — faqat o'qish uchun; @EnvironmentObject — yozish uchun

SwiftUI'da @Environment nima?

@Environment — tizim muhitidan qiymatlarni o'qish uchun mo'ljallangan SwiftUI property wrapper. Muhit — SwiftUI ota View-lardan bola View-larga avtomatik tarqatadigan iyerarxik qiymat konteyneri. Har bir muhit qiymati EnvironmentKey protokoliga mos keladigan turdagi kalit bilan identifikatsiya qilinadi.

Muhit mexanizmi framework darajasida dependency injection-ni eslatadi: tizim oldindan belgilangan qiymatlar to'plamini taqdim etadi — rang sxemasi (light/dark), locale, shrift o'lchami, Core Data uchun managedObjectContext, ekranni yopish uchun dismiss va boshqalar. Muayyan kalit bilan @Environment e'lon qilgan View avtomatik ravishda joriy qiymatni oladi va u o'zgarganda qayta chiziladi.

SwiftUI muhitining arxitekturasi EnvironmentValues protokoliga — barcha tizim qiymatlarini o'z ichiga olgan strukturaga asoslanadi. Har bir qiymat getter va setter bilan ushbu strukturaning xususiyati sifatida saqlanadi. @Environment muayyan xususiyatga kirish uchun key path-dan foydalanadi: @Environment(\.colorScheme) — rang sxemasiga kirish, @Environment(\.locale) — locale-ga kirish.

@Environment Property Wrapper sifatida

Property wrapper @Environment ikkita asosiy mexanizmni amalga oshiradi: qiymatni muhitdan o'qish va uning o'zgarishlariga obuna bo'lish. View yaratilganda SwiftUI barcha @Environment xususiyatlaridan o'tadi va ularni joriy kontekstdan tegishli qiymatlar bilan bog'laydi. Agar ota View .environment() modifikatori orqali qiymatni o'zgartirsa, ushbu qiymatni o'qiyotgan barcha bola View-lar avtomatik qayta chiziladi.

Muhim xususiyat: @Environment ixtiyoriy qiymatlarni qo'llab-quvvatlaydi. Agar qiymat iyerarxiyada o'rnatilmagan bo'lsa, EnvironmentKey'da belgilangan standart qiymat qaytariladi. Tizim kalitlari uchun standart qiymat har doim mantiqiy — masalan, rang sxemasi standart .light. Maxsus kalitlar uchun dasturchi EnvironmentKey protokolining defaultValue metodida standart qiymatni o'zi belgilaydi.

swift
struct EnvironmentReaderView: View {
    @Environment(\.colorScheme) var colorScheme
    @Environment(\.locale) var locale
    @Environment(\.sizeCategory) var sizeCategory

    var body: some View {
        VStack {
            Text("Joriy sxema: \(colorScheme == .dark ? "Dark" : "Light")")
            Text("Locale: \(locale.identifier)")
            Text("Shrift o'lchami: \(sizeCategory)")
        }
    }
}

Misolda View uchta tizim muhit qiymatini o'qiydi. colorScheme o'zgarganda — masalan, foydalanuvchi sozlamalarda qorong'i rejimni yoqdi — View avtomatik ravishda yangi qiymat bilan qayta chiziladi. Huddi shunday mintaqa yoki shrift o'lchami (Dynamic Type) o'zgarganda. View bildirishnomalarga obuna bo'lishi yoki yangilashni chaqirishi shart emas — SwiftUI buni avtomatik boshqaradi.

Tizim muhit qiymatlari

SwiftUI interfeys va xatti-harakatning turli jihatlarini qamrab oluvchi o'nlab tizim muhit qiymatlarini taqdim etadi. Rang sxemasi (\.colorScheme) — interfeysni yorug' va qorong'i temaga moslashtirishga imkon beruvchi eng ko'p talab qilinadigan qiymatlardan biri. Locale (\.locale) sanalar, raqamlar va valyutalarni formatlash uchun foydalanuvchining mintaqaviy sozlamalarini o'z ichiga oladi.

Core Data uchun managedObjectContext (\.managedObjectContext) ishlatiladi — persistence container'dan muhit orqali uzatiladigan kontekst. Navigatsiya uchun joriy ekranni yopish uchun dismiss (\.dismiss) va modal ko'rinishlar uchun isPresented (\.isPresented) mavjud. Kalendar va vaqt mintaqasi uchun mos ravishda calendar va timeZone.

Key PathTurMaqsad
\.colorSchemeColorSchemeYorug' yoki qorong'i tema
\.localeLocaleMintaqaviy sozlamalar
\.sizeCategoryContentSizeCategoryDynamic Type shrift o'lchami
\.managedObjectContextNSManagedObjectContextCore Data konteksti
\.dismissDismissActionEkranni yopish
\.calendarCalendarJoriy kalendar
\.timeZoneTimeZoneVaqt mintaqasi
\.horizontalSizeClassUserInterfaceSizeClassEkranning gorizontal o'lchami

Tizim qiymatlariga kirish uchun nuqta orqali key path dan foydalaning: @Environment(\.dismiss) var dismiss. Kompilyator EnvironmentValues'da key path mavjudligini tekshiradi, shuning uchun noto'g'ri kalit kompilyatsiya bosqichida xatoga olib keladi. Yangi tizim qiymatlari Apple tomonidan iOS'ning har bir versiyasi bilan qo'shiladi — joriy ro'yxat EnvironmentValues hujjatlarida mavjud.

@Environment vs @EnvironmentObject

O'xshash nomlarga qaramay, @Environment va @EnvironmentObject turli vazifalarni hal qiladi. @Environment EnvironmentKey orqali ro'yxatdan o'tgan tizim yoki maxsus qiymatlarni o'qiydi. @EnvironmentObject — aniq kalitsiz, turi bo'yicha muhit orqali uzatiladigan ObservableObject uchun property wrapper.

@EnvironmentObject dependency injection uchun ishlatiladi: ota View obyekt yaratadi (masalan, ViewModel) va uni .environmentObject() modifikatori orqali bola View-larga uzatadi. Bola View-lar uni @EnvironmentObject orqali oladi va uning xususiyatlarini o'qishi va o'zgartirishi mumkin. @Environment esa — tizim qiymatlarini faqat o'qish uchun va qayta aloqani qo'llab-quvvatlamaydi.

Parametr@Environment@EnvironmentObject
MaqsadTizim va maxsus qiymatlarObservableObject inyeksiyasi
KalitEnvironmentValues key pathObyekt turiga ko'ra
YozishFaqat o'qishO'qish va yozish
Maxsus qiymatEnvironmentKey orqaliObservableObject sinfi orqali
Standart qiymatBor (defaultValue)Yo'q (uzatilishi kerak)

Amalda: tizim parametrlariga (tema, locale, shrift o'lchami) va runtime'da o'zgarmaydigan maxsus konfiguratsiyalarga kirish uchun @Environment dan foydalaning. ViewModel yoki xizmatni View iyerarxiyasi orqali uzatish uchun, bola komponentlardan holatni o'zgartirish talab qilinganda @EnvironmentObject dan foydalaning.

@Environment kod misollari

Maxsus muhit qiymatini yaratishni ko'rib chiqaylik. Buning uchun EnvironmentKey protokoliga mos keladigan strukturani aniqlash va EnvironmentValues-ni yangi xususiyat bilan kengaytirish kerak. Bu propslarsiz butun View daraxti orqali tema konfiguratsiyasi yoki ilova sozlamalarini uzatishga imkon beradi.

swift
struct AppThemeKey: EnvironmentKey {
    static let defaultValue: AppTheme = .system
}

extension EnvironmentValues {
    var appTheme: AppTheme {
        get { self[AppThemeKey.self] }
        set { self[AppThemeKey.self] = newValue }
    }
}

enum AppTheme { case system, light, dark }

EnvironmentKey protokoli static defaultValue xususiyatining amalga oshirilishini talab qiladi — agar ota View maxsus muhitni o'rnatmagan bo'lsa ishlatiladigan qiymat. EnvironmentValues kengaytmasi kalit bilan subscript yordamida appTheme hisoblangan xususiyatini qo'shadi. Shundan so'ng har qanday View @Environment(\.appTheme) orqali qiymatni o'qishi mumkin.

Maxsus kalit bilan @Environment'dan foydalanish

swift
struct ThemedView: View {
    @Environment(\.appTheme) var appTheme
    @Environment(\.colorScheme) var colorScheme

    var body: some View {
        VStack {
            if appTheme == .dark || (appTheme == .system && colorScheme == .dark) {
                Text("Qorong'i rejim faol")
                    .foregroundStyle(.white)
                    .background(Color.black)
            } else {
                Text("Yorug' rejim faol")
                    .foregroundStyle(.black)
                    .background(Color.white)
            }
        }
    }
}

struct ContentView: View {
    @State private var selectedTheme = AppTheme.system

    var body: some View {
        ThemedView()
            .environment(\.appTheme, selectedTheme)
    }
}

ThemedView ikkita muhitni o'qiydi: maxsus appTheme va tizim colorScheme. Kombinatsiya moslashuvchan tema sozlashni amalga oshirishga imkon beradi: foydalanuvchi „Yorug'”, „Qorong'i” yoki „Tizim” temasini tanlashi mumkin. Agar tizim tanlangan bo'lsa — qiymat iOS sozlamalarida tema almashtirilganda avtomatik o'zgaradigan colorScheme'dan olinadi. Ota View (ContentView) .environment() modifikatori orqali appTheme qiymatini o'rnatadi.

Ekranni yopish uchun dismiss'dan foydalanish

swift
struct ModalView: View {
    @Environment(\.dismiss) var dismiss
    @State private var name = ""

    var body: some View {
        NavigationStack {
            Form {
                TextField("Your name", text: $name)
                Button("Saqlash") { dismiss() }
            }
            .navigationTitle("Edit Profile")
        }
    }
}

Ushbu misol muhitdan dismiss — DismissAction namunasi amaliy qo'llanilishini ko'rsatadi. dismiss() funksiya sifatida chaqiruvi modal ekranni yopadi yoki NavigationLink-ni qaytaradi. Yagona talab — View modal tarzda taqdim etilgan yoki NavigationStack ichida bo'lishi kerak. dismiss kontekstdan avtomatik aniqlanadi: agar View sheet sifatida ochilgan bo'lsa — sheet yopiladi, popover sifatida ochilgan bo'lsa — popover yopiladi.

Tez-tez so'raladigan savollar

Bola View'dan @Environment qiymatini o'zgartirish mumkinmi?

Yo'q, @Environment faqat o'qish uchun mo'ljallangan. Qiymatlarni o'zgartirish uchun ObservableObject bilan @EnvironmentObject yoki @Binding dan foydalaning. Maxsus EnvironmentKey kengaytmada setter-ga ega bo'lishi mumkin, ammo u orqali o'zgartirish UI yangilanishini tetiklamaydi — bu texnik jihatdan mumkin, ammo tavsiya etilmaydi.

@Environment @Binding'dan nima bilan farq qiladi?

@Binding haqiqat manbai (State, StateObject, ObservableObject) bilan ikki tomonlama aloqa yaratadi. @Environment — ierarxik kontekstdan bir tomonlama o'qish. @Binding ma'lumotlarni bola View'ga uzatish uchun mos, @Environment — tizim yoki global sozlamalarga kirish uchun.

O'z muhit qiymatini qanday yaratish mumkin?

static defaultValue bilan EnvironmentKey protokolini amalga oshiruvchi strukturani aniqlang. Keyin subscript[key] orqali getter/setter bilan xususiyat qo'shib, EnvironmentValues-ni kengaytiring. Ro'yxatdan o'tgandan so'ng o'qish uchun @Environment(\.yourKey) va o'rnatish uchun .environment(\.yourKey, value) dan foydalaning.

SwiftUI'da qanday muhit qiymatlari mavjud?

SwiftUI 50 dan ortiq tizim qiymatlarini taqdim etadi: colorScheme, locale, sizeCategory, managedObjectContext, dismiss, calendar, timeZone, horizontalSizeClass, verticalSizeClass, accessibilityEnabled, layoutDirection, legibilityWeight va boshqalar. To'liq ro'yxat EnvironmentValues hujjatlarida.

@Environment Preview'da ishlaydimi?

Ha, @Environment Preview'da ishlaydi, lekin standart qiymatlar simulyatordan farq qilishi mumkin. Preview'da sinash uchun to'g'ridan-to'g'ri Preview kodida .environment() modifikatoridan foydalaning: ThemedView().environment(\.colorScheme, .dark). Bu muhitning turli holatlarini vizual tekshirishga imkon beradi.

Xulosa

  • @Environment — key path orqali SwiftUI tizim muhiti qiymatlarini o'qish uchun property wrapper
  • Rang sxemasi, locale, shrift o'lchami va managedObjectContext — eng ko'p talab qilinadigan tizim qiymatlari
  • Muhit o'zgarishi barcha obuna bo'lgan View-larning avtomatik qayta chizilishiga sabab bo'ladi
  • Maxsus EnvironmentKey ilova muhitini global sozlamalar bilan kengaytirishga imkon beradi
  • @Environment — faqat o'qish uchun; @EnvironmentObject — yozish bilan ObservableObject uchun
  • .environment() modifikatori iyerarxiyada bola View-lar uchun qiymatni o'rnatadi
  • Foydalaning @Environment tizim parametrlari uchun, @EnvironmentObject — ViewModel va xizmatlar uchun

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