SwiftUI में @Environment एक property wrapper है जो सिस्टम पर्यावरण से मान पढ़ने के लिए है, जो स्वचालित रूप से View पदानुक्रम में वितरित होते हैं। यह घटक रंग योजना, स्थानीयता, फ़ंट आकार, managedObjectContext और दर्जनों अन्य सिस्टम पैरामीटरों तक पहुँच प्रदान करता है। Apple Developer Documentation (2025) के अनुसार, @Environment गारंटी देता है कि पर्यावरण मान में कोई भी बदलाव सभी सदस्यता प्राप्त Views को पुनः खींचने का कारण बनता है, जो बिना मैनुअल कॉल के रिएक्टिव इंटरफ़ेस अपडेट प्रदान करता है।
मुख्य बातें
@Environment एक SwiftUI property wrapper है जो सिस्टम पर्यावरण से मान पढ़ने के लिए डिजाइन किया गया है। पर्यावरण मानों का एक अनुक्रमिक कंटेनर है जिसे SwiftUI स्वचालित रूप से पैरेंट Views से चाइल्ड Views में वितरित करता है। प्रत्येक पर्यावरण मान एक कुंजी से पहचाना जाता है — एक प्रकार जो EnvironmentKey प्रोटोकॉल का अनुपालन करता है।
पर्यावरण तंत्र फ्रेमवर्क स्तर पर dependency injection के समान है: सिस्टम मानों का एक पूर्वनिर्धारित सेट प्रदान करता है — रंग योजना (हल्का/अंधेरा), स्थानीयता, फ़ंट आकार, Core Data के लिए managedObjectContext, स्क्रीन बंद करने के लिए dismiss, और कई अन्य। एक View जो एक विशेष कुंजी के साथ @Environment घोषित करता है स्वचालित रूप से वर्तमान मान प्राप्त करता है और इसके बदलने पर पुनः खींचता है।
SwiftUI पर्यावरण आर्किटेक्चर EnvironmentValues प्रोटोकॉल पर आधारित है — एक संरचना जिसमें सभी सिस्टम मान होते हैं। प्रत्येक मान गेटर और सेटर के साथ इस संरचना की एक संपत्ति के रूप में संग्रहीत होता है। @Environment एक विशेष संपत्ति तक पहुँचने के लिए key path का उपयोग करता है: @Environment(\.colorScheme) — रंग योजना तक पहुँच, @Environment(\.locale) — स्थानीयता तक पहुँच।
Property wrapper @Environment दो मुख्य तंत्रों को लागू करता है: पर्यावरण से मान पढ़ना और इसके परिवर्तनों की सदस्यता लेना। जब कोई View बनाया जाता है, SwiftUI सभी @Environment गुणों से गुजरता है और उन्हें वर्तमान संदर्भ से संबंधित मानों से जोड़ता है। यदि कोई पैरेंट View .environment() मॉडिफायर के माध्यम से किसी मान को बदलता है, तो उस मान को पढ़ने वाले सभी चाइल्ड Views स्वचालित रूप से पुनः खींचे जाते हैं।
एक महत्वपूर्ण विशेषता: @Environment ऐच्छिक मानों का समर्थन करता है। यदि अनुक्रम में कोई मान सेट नहीं है, तो EnvironmentKey में परिभाषित डिफ़ॉल्ट मान लौटाया जाता है। सिस्टम कुंजियों के लिए, डिफ़ॉल्ट मान हमेशा उचित होता है — उदाहरण के लिए, डिफ़ॉल्ट रंग योजना .light है। कस्टम कुंजियों के लिए, डिब्लॉपर EnvironmentKey प्रोटोकॉल की defaultValue विधि में डिफ़ॉल्ट मान परिभाषित करता है।
struct EnvironmentReaderView: View {
@Environment(\.colorScheme) var colorScheme
@Environment(\.locale) var locale
@Environment(\.sizeCategory) var sizeCategory
var body: some View {
VStack {
Text("Current scheme: \(colorScheme == .dark ? "Dark" : "Light")")
Text("Locale: \(locale.identifier)")
Text("Font size: \(sizeCategory)")
}
}
}
उदाहरण में, View तीन सिस्टम पर्यावरण मान पढ़ता है। जब colorScheme बदलता है — उदाहरण के लिए, उपयोगकर्ता ने सेटिंग्स में डार्क मोड सक्षम किया — View नए मान के साथ स्वचालित रूप से पुनः खींचता है। इसी तरह जब क्षेत्र या फ़ंट आकार (Dynamic Type) बदलता है। View को अधिसूचनाओं पर सदस्यता लेने या refresh कॉल करने की आवश्यकता नहीं है — SwiftUI इसे स्वचालित रूप से प्रबंधित करता है।
SwiftUI इंटरफ़ेस और व्यवहार के विभिन्न पहलुओं को कवर करने वाले दर्जनों सिस्टम पर्यावरण मान प्रदान करता है। रंग योजना (\.colorScheme) सबसे अधिक उपयोग किए जाने वाले मानों में से एक है, जो इंटरफ़ेस को हल्के और अंधेरे थीम के अनुकूल ढलने की अनुमति देता है। स्थानीयता (\.locale) में दिनांकों, संख्याओं और मुद्राओं को फ़ॉर्मेट करने के लिए उपयोगकर्ता की क्षेत्रीय सेटिंग्स होती है।
Core Data के लिए, managedObjectContext (\.managedObjectContext) का उपयोग किया जाता है — एक संदर्भ जो पेर्सिस्टेंस कंटेनर से पर्यावरण के माध्यम से पारित होता है। नेविगेशन के लिए, वर्तमान स्क्रीन को बंद करने के लिए dismiss (\.dismiss) और मोडल प्रस्तुतियों के लिए isPresented (\.isPresented) उपलब्ध है। कैलेंडर और समय क्षेत्र के लिए — क्रमशः calendar और timeZone।
| Key Path | प्रकार | उद्देश्य |
|---|---|---|
| \.colorScheme | ColorScheme | हल्का या अंधेरा थीम |
| \.locale | Locale | क्षेत्रीय सेटिंग्स |
| \.sizeCategory | ContentSizeCategory | Dynamic Type फ़ंट आकार |
| \.managedObjectContext | NSManagedObjectContext | Core Data संदर्भ |
| \.dismiss | DismissAction | स्क्रीन बंद करें |
| \.calendar | Calendar | वर्तमान कैलेंडर |
| \.timeZone | TimeZone | समय क्षेत्र |
| \.horizontalSizeClass | UserInterfaceSizeClass | क्षैतिज स्क्रीन आकार |
सिस्टम मानों तक पहुँचने के लिए, एक बिंदु के साथ key path का उपयोग करें: @Environment(\.dismiss) var dismiss. कंपाइलर EnvironmentValues में key path की उपस्थिति की जाँच करता है, इसलिए एक गलत कुंजी संकलन समय त्रुटि का कारण बनेगी। Apple iOS के प्रत्येक संस्करण के साथ नए सिस्टम मान जोड़ता है — पूरी सूची EnvironmentValues दस्तावेज़ीकरण में उपलब्ध है।
समान नामों के बावजूद, @Environment और @EnvironmentObject अलग-अलग उद्देश्यों की पूर्ति करते हैं। @Environment EnvironmentKey के माध्यम से पंजीकृत सिस्टम या कस्टम मानों को पढ़ता है। @EnvironmentObject एक ObservableObject के लिए property wrapper है जो बिना स्पष्ट कुंजी के प्रकार के आधार पर पर्यावरण के माध्यम से पारित होता है।
@EnvironmentObject का उपयोग dependency injection के लिए किया जाता है: एक पैरेंट View एक ऑब्जेक्ट (जैसे ViewModel) बनाता है और इसे .environmentObject() मॉडिफायर के माध्यम से चाइल्ड Views में भेजता है। चाइल्ड Views इसे @EnvironmentObject के माध्यम से प्राप्त करते हैं और इसके गुणों को पढ़ और बदल सकते हैं। दूसरी ओर, @Environment सिस्टम मानों के लिए केवल पढ़ने के लिए है और प्रतिपुष्टि का समर्थन नहीं करता है।
| पैरामीटर | @Environment | @EnvironmentObject |
|---|---|---|
| उद्देश्य | सिस्टम और कस्टम मान | ObservableObject इंजेक्शन |
| कुंजी | EnvironmentValues key path | ऑब्जेक्ट प्रकार के आधार पर |
| लिखना | केवल पढ़ना | पढ़ना और लिखना |
| कस्टम मान | EnvironmentKey के माध्यम से | ObservableObject वर्ग के माध्यम से |
| डिफ़ॉल्ट मान | हाँ (defaultValue) | नहीं (पारित करना अनिवार्य) |
व्यावहारिक रूप से: सिस्टम पैरामीटर (थीम, स्थानीयता, फ़ंट आकार) और कस्टम कॉन्फ़िगरेशन तक पहुँचने के लिए @Environment का उपयोग करें जो रनटाइम पर नहीं बदलते हैं। View पदानुक्रम के माध्यम से ViewModel या सेवा पारित करने के लिए @EnvironmentObject का उपयोग करें जब स्थिति को चाइल्ड घटकों से संशोधित करने की आवश्यकता होती है।
एक कस्टम पर्यावरण मान बनाने पर नज़र डालें। इसके लिए, आपको EnvironmentKey प्रोटोकॉल का अनुपालन करने वाली एक संरचना परिभाषित करनी होगी और EnvironmentValues को एक नई संपत्ति के साथ विस्तारित करना होगा। यह बिना props के पूरे View ट्री में थीम कॉन्फ़िगरेशन या ऐप सेटिंग्स पारित करने की अनुमति देता है।
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 प्रोटोकॉल को स्थिर defaultValue गुण के कार्यान्वयन की आवश्यकता होती है — वह मान जो उपयोग किया जाएगा यदि पैरेंट View ने कस्टम पर्यावरण सेट नहीं किया है। EnvironmentValues का विस्तार कुंजी के साथ subscript का उपयोग करके एक गणना संपत्ति appTheme जोड़ता है। इसके बाद, कोई भी View @Environment(\.appTheme) के माध्यम से मान पढ़ सकता है।
struct ThemedView: View {
@Environment(\.appTheme) var appTheme
@Environment(\.colorScheme) var colorScheme
var body: some View {
VStack {
if appTheme == .dark || (appTheme == .system && colorScheme == .dark) {
Text("Dark mode active")
.foregroundStyle(.white)
.background(Color.black)
} else {
Text("Light mode active")
.foregroundStyle(.black)
.background(Color.white)
}
}
}
}
struct ContentView: View {
@State private var selectedTheme = AppTheme.system
var body: some View {
ThemedView()
.environment(\.appTheme, selectedTheme)
}
}
ThemedView दो पर्यावरण पढ़ता है: कस्टम appTheme और सिस्टम colorScheme। संयोजन लचीला थीम कॉन्फ़िगरेशन की अनुमति देता है: उपयोगकर्ता हल्का, अंधेरा या सिस्टम थीम चुन सकता है। यदि सिस्टम चुना गया है, तो मान colorScheme से लिया जाता है, जो iOS सेटिंग्स में थीम बदलने पर स्वचालित रूप से बदलता है। पैरेंट View (ContentView) .environment() मॉडिफायर के माध्यम से appTheme मान सेट करता है।
struct ModalView: View {
@Environment(\.dismiss) var dismiss
@State private var name = ""
var body: some View {
NavigationStack {
Form {
TextField("Your name", text: $name)
Button("Save") { dismiss() }
}
.navigationTitle("Edit Profile")
}
}
}
यह उदाहरण dismiss के व्यावहारिक उपयोग को प्रदर्शित करता है — पर्यावरण से DismissAction का एक उदाहरण। एक फ़ंक्शन के रूप में dismiss() को कॉल करने से मोडल स्क्रीन बंद हो जाती है या NavigationLink वापस आता है। एकमात्र आवश्यकता यह है कि View मोडल रूप से प्रस्तुत की जाए या NavigationStack के अंदर हो। dismiss स्वचालित रूप से संदर्भ से निर्धारित होता है: यदि View एक sheet के रूप में खुली है — sheet बंद हो जाती है, यदि popover के रूप में — popover बंद हो जाता है।
अक्सर पूछे जाने वाले प्रश्न
नहीं, @Environment केवल पढ़ने के लिए है। मान बदलने के लिए, ObservableObject के साथ @EnvironmentObject या @Binding का उपयोग करें। कस्टम EnvironmentKeys में विस्तार में setter हो सकता है, लेकिन इसके माध्यम से बदलना UI अपडेट को ट्रिगर नहीं करता — यह तकनीकी रूप से संभव है लेकिन अनुशंसित नहीं है।
@Binding सत्य के स्रोत (State, StateObject, ObservableObject) के सاथ एक दो-तरफा संबंध बनाता है। @Environment अनुक्रमिक संदर्भ से एक-तरफा पढ़ना है। @Binding किसी चाइल्ड View को डेटा भेजने के लिए उपयुक्त है, @Environment — सिस्टम या ग्लोबल सेटिंग्स तक पहुँचने के लिए।
एक संरचना परिभाषित करें जो एक स्थिर defaultValue के साथ EnvironmentKey प्रोटोकॉल को लागू करता है। फिर subscript[key] के माध्यम से getter/setter का उपयोग करके EnvironmentValues को एक संपत्ति के साथ विस्तारित करें। पंजीकरण के बाद, @Environment(\.yourKey) का उपयोग पढ़ने के लिए और .environment(\.yourKey, value) का उपयोग सेट करने के लिए करें।
SwiftUI 50 से अधिक सिस्टम मान प्रदान करता है: colorScheme, locale, sizeCategory, managedObjectContext, dismiss, calendar, timeZone, horizontalSizeClass, verticalSizeClass, accessibilityEnabled, layoutDirection, legibilityWeight और अन्य। पूरी सूची EnvironmentValues दस्तावेज़ीकरण में मिलेगी।
हाँ, @Environment Preview में काम करता है, लेकिन डिफ़ॉल्ट मान सिमुलेटर से भिन्न हो सकते हैं। Preview में परीक्षण के लिए, Preview कोड में सीधे .environment() मॉडिफायर का उपयोग करें: ThemedView().environment(\.colorScheme, .dark). यह विभिन्न पर्यावरण स्थितियों की दृश्य जाँच करने की अनुमति देता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें