@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 — 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-ı 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.
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.
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 Path | Tip | Təyinat |
|---|---|---|
| \.colorScheme | ColorScheme | Açıq və ya qaranlıq tema |
| \.locale | Locale | Regional parametrlər |
| \.sizeCategory | ContentSizeCategory | Dynamic Type şrift ölçüsü |
| \.managedObjectContext | NSManagedObjectContext | Core Data konteksti |
| \.dismiss | DismissAction | Ekranı bağlamaq |
| \.calendar | Calendar | Cari təqvim |
| \.timeZone | TimeZone | Saat qurşağı |
| \.horizontalSizeClass | UserInterfaceSizeClass | Ekranı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.
Oxşar adlara baxmayaraq, @Environment və @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əyinat | Sistem və fərdi dəyərlər | ObservableObject inyeksiyası |
| Açar | EnvironmentValues key path | Obyekt tipinə görə |
| Yazma | Yalnız oxuma | Oxuma və yazma |
| Fərdi dəyər | EnvironmentKey vasitəsilə | ObservableObject sinfi vasitəsilə |
| Standart dəyər | Var (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.
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.
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.
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.
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
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.
@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.
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 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ə.
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ə
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.
Həm də oxuyun