SwiftUI-də @Environment — bu nədir, əsas anlayışlar və mexanizm

Müəllif: IT Sectr Dərc olunub: 2026-06-25 Oxuma vaxtı: 8 dəq

@Environment SwiftUI-də — View iyerarxiyası boyunca avtomatik yayılan sistem mühiti dəyərlərini oxumaq üçün property wrapper. Komponent rəng sxeminə, locale-ə, şrift ölçüsünə, managedObjectContext-ə və onlarla digər sistem parametrlərinə giriş təmin edir. Apple Developer Documentation (2025)-ə görə, @Environment mühit dəyərindəki hər hansı dəyişikliyin bütün abunə olunmuş View-lərin yenidən çəkilməsinə səbəb olduğunu təmin edir və əl ilə çağırışlar olmadan interfeysin reaktiv yenilənməsini təmin edir.

Əsas məqamlar

  • @Environment — SwiftUI sistem mühiti dəyərlərini oxumaq üçün property wrapper
  • Rəng sxemi, locale və şrift ölçüsü — tez-tez istifadə olunan sistem dəyərləri
  • Hər hansı mühit dəyişikliyi abunə olunmuş View-lərin avtomatik yenidən çəkilməsinə səbəb olur
  • Fərdi açarlar EnvironmentKey vasitəsilə öz mühit dəyərlərini yaratmağa imkan verir
  • @Environment — yalnız oxumaq üçün; @EnvironmentObject — yazmaq üçün

SwiftUI-də @Environment nədir?

@Environment — sistem mühitindən dəyərləri oxumaq üçün nəzərdə tutulmuş SwiftUI property wrapper-ıdır. Mühit — SwiftUI-nin valideyn View-lərdən uşaq View-lərə avtomatik yaydığı iyerarxik dəyər konteyneridir. Hər bir mühit dəyəri EnvironmentKey protokoluna uyğun tip olan açarla identifikasiya olunur.

Mühit mexanizmi framework səviyyəsində dependency injection-u xatırladır: sistem əvvəlcədən təyin olunmuş dəyərlər dəstini təqdim edir — rəng sxemi (light/dark), locale, şrift ölçüsü, Core Data üçün managedObjectContext, ekranı bağlamaq üçün dismiss və bir çox başqaları. Müəyyən açarla @Environment elan etmiş View avtomatik olaraq cari dəyəri alır və dəyişdikdə yenidən çəkilir.

SwiftUI mühitinin arxitekturası EnvironmentValues protokoluna — bütün sistem dəyərlərini ehtiva edən struktura əsaslanır. Hər bir dəyər getter və setter ilə bu strukturun xassəsi kimi saxlanılır. @Environment müəyyən xassəyə daxil olmaq üçün key path-dən istifadə edir: @Environment(\.colorScheme) — rəng sxeminə giriş, @Environment(\.locale) — locale-ə giriş.

@Environment Property Wrapper kimi

@Environment property wrapper-ı iki əsas mexanizmi həyata keçirir: dəyəri mühitdən oxumaq və onun dəyişikliklərinə abunə olmaq. View yaradılarkən SwiftUI bütün @Environment-xassələrindən keçir və onları cari kontekstdən müvafiq dəyərlərlə əlaqələndirir. Valideyn View .environment() modifier-i vasitəsilə dəyəri dəyişərsə, bu dəyəri oxuyan bütün uşaq View-lər avtomatik yenidən çəkilir.

Əhəmiyyətli xüsusiyyət: @Environment isteğe bağlı dəyərləri dəstəkləyir. Əgər dəyər iyerarxiyada təyin edilməyibsə, EnvironmentKey-də təyin olunmuş standart dəyər qaytarılır. Sistem açarları üçün standart dəyər həmişə məntiqlidir — məsələn, rəng sxemi standart olaraq .light. Fərdi açarlar üçün proqramçı EnvironmentKey protokolunun defaultValue metodunda standart dəyəri özü təyin edir.

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

    var body: some View {
        VStack {
            Text("Cari sxem: \(colorScheme == .dark ? "Dark" : "Light")")
            Text("Locale: \(locale.identifier)")
            Text("Şrift ölçüsü: \(sizeCategory)")
        }
    }
}

Nümunədə View üç sistem mühit dəyərini oxuyur. colorScheme dəyişdikdə — məsələn, istifadəçi parametrlərdə qaranlıq rejimi aktiv etdikdə — View avtomatik olaraq yeni dəyərlə yenidən çəkilir. Region və ya şrift ölçüsü (Dynamic Type) dəyişdikdə də eyni şəkildə. View bildirişlərə abunə olmalı və ya yeniləməni çağırmalı deyil — SwiftUI bunu avtomatik idarə edir.

Sistem mühit dəyərləri

SwiftUI interfeys və davranışın müxtəlif aspektlərini əhatə edən onlarla sistem mühit dəyəri təqdim edir. Rəng sxemi (\.colorScheme) — interfeysi açıq və qaranlıq temaya uyğunlaşdırmağa imkan verən ən çox tələb olunan dəyərlərdən biridir. Locale (\.locale) tarixlərin, rəqəmlərin və valyutaların formatlanması üçün istifadəçinin regional parametrlərini ehtiva edir.

Core Data üçün managedObjectContext (\.managedObjectContext) istifadə olunur — persistence container-dən mühit vasitəsilə ötürülən kontekst. Naviqasiya üçün cari ekranı bağlamaq üçün dismiss (\.dismiss) və modal görünüşlər üçün isPresented (\.isPresented) mövcuddur. Təqvim və saat qurşağı üçün müvafiq olaraq calendar və timeZone.

Key PathTipTəyinat
\.colorSchemeColorSchemeAçıq və ya qaranlıq tema
\.localeLocaleRegional parametrlər
\.sizeCategoryContentSizeCategoryDynamic Type şrift ölçüsü
\.managedObjectContextNSManagedObjectContextCore Data konteksti
\.dismissDismissActionEkranı bağlamaq
\.calendarCalendarCari təqvim
\.timeZoneTimeZoneSaat qurşağı
\.horizontalSizeClassUserInterfaceSizeClassEkranın üfüqi ölçüsü

Sistem dəyərlərinə daxil olmaq üçün nöqtə vasitəsilə key path-dən istifadə edin: @Environment(\.dismiss) var dismiss. Kompilyator EnvironmentValues-da key path-in mövcudluğunu yoxlayır, buna görə səhv açar kompilyasiya mərhələsində xətaya səbəb olacaq. Yeni sistem dəyərləri Apple tərəfindən iOS-un hər versiyası ilə əlavə olunur — cari siyahı EnvironmentValues sənədlərində mövcuddur.

@Environment vs @EnvironmentObject

Oxşar adlara baxmayaraq, @Environment@EnvironmentObject müxtəlif vəzifələri həll edir. @Environment EnvironmentKey vasitəsilə qeydiyyatdan keçmiş sistem və ya fərdi dəyərləri oxuyur. @EnvironmentObject — aşkar açar olmadan tipinə görə mühit vasitəsilə ötürülən ObservableObject üçün property wrapper-dır.

@EnvironmentObject dependency injection üçün istifadə olunur: valideyn View obyekt yaradır (məsələn, ViewModel) və onu .environmentObject() modifier-i vasitəsilə uşaq View-lərə ötürür. Uşaq View-lər onu @EnvironmentObject vasitəsilə alır və həm oxuya, həm də xassələrini dəyişə bilər. @Environment isə — sistem dəyərlərinin yalnız oxunması üçündür və əks əlaqəni dəstəkləmir.

Parametr@Environment@EnvironmentObject
TəyinatSistem və fərdi dəyərlərObservableObject inyeksiyası
AçarEnvironmentValues key pathObyekt tipinə görə
YazmaYalnız oxumaOxuma və yazma
Fərdi dəyərEnvironmentKey vasitəsiləObservableObject sinfi vasitəsilə
Standart dəyərVar (defaultValue)Yox (ötürülməlidir)

Praktikada: sistem parametrlərinə (tema, locale, şrift ölçüsü) və runtime-da dəyişməyən fərdi konfiqurasiyalara daxil olmaq üçün @Environment istifadə edin. ViewModel və ya xidməti View iyerarxiyası vasitəsilə ötürmək üçün, uşaq komponentlərdən vəziyyəti dəyişmək tələb olunduqda @EnvironmentObject istifadə edin.

@Environment kod nümunələri

Fərdi mühit dəyərinin yaradılmasını nəzərdən keçirək. Bunun üçün EnvironmentKey protokoluna uyğun strukturu təyin etmək və EnvironmentValues-ı yeni xassə ilə genişləndirmək lazımdır. Bu, props olmadan bütün View ağacı vasitəsilə tema konfiqurasiyasını və ya tətbiq parametrlərini ötürməyə imkan verir.

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 protokolu static defaultValue xassəsinin tətbiqini tələb edir — valideyn View fərdi mühiti təyin etməyibsə istifadə olunacaq dəyər. EnvironmentValues genişləndirməsi açar ilə subscript istifadə edərək appTheme hesablanan xassəsini əlavə edir. Bundan sonra istənilən View @Environment(\.appTheme) vasitəsilə dəyəri oxuya bilər.

Fərdi açar ilə @Environment istifadəsi

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("Qaranlıq rejim aktiv")
                    .foregroundStyle(.white)
                    .background(Color.black)
            } else {
                Text("Açıq rejim aktiv")
                    .foregroundStyle(.black)
                    .background(Color.white)
            }
        }
    }
}

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

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

ThemedView iki mühiti oxuyur: fərdi appTheme və sistem colorScheme. Kombinasiya çevik tema tənzimləməsini həyata keçirməyə imkan verir: istifadəçi „Açıq”, „Qaranlıq” və ya „Sistem” temasını seçə bilər. Sistem seçilibsə — dəyər iOS parametrlərində tema dəyişdirilərkən avtomatik dəyişən colorScheme-dan götürülür. Valideyn View (ContentView) .environment() modifier-i vasitəsilə appTheme dəyərini təyin edir.

Ekranı bağlamaq üçün dismiss istifadəsi

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

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

Bu nümunə mühitdən dismiss — DismissAction nümunəsinin praktiki istifadəsini göstərir. dismiss() funksiyası kimi çağırışı modal ekranı bağlayır və ya NavigationLink-i geri qaytarır. Yeganə tələb — View modal şəkildə təqdim edilməli və ya NavigationStack daxilində olmalıdır. dismiss kontekstdən avtomatik müəyyən edilir: View sheet kimi açılıbsa — sheet bağlanır, popover kimi açılıbsa — popover bağlanır.

Tez-tez verilən suallar

Uşaq View-dən @Environment dəyərini dəyişmək olarmı?

Xeyr, @Environment yalnız oxumaq üçün nəzərdə tutulub. Dəyərləri dəyişmək üçün ObservableObject ilə @EnvironmentObject və ya @Binding istifadə edin. Fərdi EnvironmentKey genişləndirmədə setter-ə malik ola bilər, lakin onun vasitəsilə dəyişiklik UI yeniləməsini tetiklemir — bu texniki cəhətdən mümkündür, lakin tövsiyə edilmir.

@Environment @Binding-dən nə ilə fərqlənir?

@Binding həqiqət mənbəyi (State, StateObject, ObservableObject) ilə ikitərəfli əlaqə yaradır. @Environment — ierarxik kontekstdən birtərəfli oxuma. @Binding məlumatları uşaq View-ə ötürmək üçün uyğundur, @Environment — sistem və ya qlobal parametrlərə daxil olmaq üçün.

Öz mühit dəyərini necə yaratmaq olar?

static defaultValue ilə EnvironmentKey protokolunu həyata keçirən strukturu təyin edin. Sonra subscript[key] vasitəsilə getter/setter ilə xassə əlavə edərək EnvironmentValues-ı genişləndirin. Qeydiyyatdan sonra oxumaq üçün @Environment(\.yourKey) və təyin etmək üçün .environment(\.yourKey, value) istifadə edin.

SwiftUI-də hansı mühit dəyərləri mövcuddur?

SwiftUI 50-dən çox sistem dəyəri təqdim edir: colorScheme, locale, sizeCategory, managedObjectContext, dismiss, calendar, timeZone, horizontalSizeClass, verticalSizeClass, accessibilityEnabled, layoutDirection, legibilityWeight və başqaları. Tam siyahı EnvironmentValues sənədlərində.

@Environment Preview-də işləyirmi?

Bəli, @Environment Preview-də işləyir, lakin standart dəyərlər simulyatordan fərqlənə bilər. Preview-də sınamaq üçün birbaşa Preview kodunda .environment() modifierindən istifadə edin: ThemedView().environment(\.colorScheme, .dark). Bu, mühitin müxtəlif vəziyyətlərini vizual yoxlamağa imkan verir.

Nəticə

  • @Environment — key path vasitəsilə SwiftUI sistem mühiti dəyərlərini oxumaq üçün property wrapper
  • Rəng sxemi, locale, şrift ölçüsü və managedObjectContext — ən çox tələb olunan sistem dəyərləri
  • Mühit dəyişikliyi bütün abunə olunmuş View-lərin avtomatik yenidən çəkilməsinə səbəb olur
  • Fərdi EnvironmentKey tətbiqin mühitini qlobal parametrlərlə genişləndirməyə imkan verir
  • @Environment — yalnız oxumaq üçün; @EnvironmentObject — yazma ilə ObservableObject üçün
  • .environment() modifier-i iyerarxiyada uşaq View-lər üçün dəyər təyin edir
  • İstifadə edin @Environment sistem parametrləri üçün, @EnvironmentObject — ViewModel və xidmətlər üçün

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun