@EnvironmentObject SwiftUI में एक property wrapper है जो पदानुक्रम में किसी भी View को इनिशियलाइज़र की श्रृंखला के माध्यम से स्पष्ट रूप से पास किए बिना ObservableObject तक पहुँचने की अनुमति देता है। ऑब्जेक्ट को .environmentObject() मॉडिफ़ायर का उपयोग करके पदानुक्रम के एक विशिष्ट स्तर पर पर्यावरण में इंजेक्ट किया जाता है, जिसके बाद सभी चाइल्ड View इसे @EnvironmentObject के माध्यम से प्राप्त कर सकते हैं। यह मध्यवर्ती View के माध्यम से ऑब्जेक्ट पास करने की आवश्यकता को समाप्त करता है जो इसका उपयोग नहीं करते — तथाकथित prop drilling। जॉन सुंडेल — Swift by Sundell (2025) के लेख के अनुसार, @EnvironmentObject क्रॉस-स्क्रीन डेटा के लिए विशेष रूप से उपयोगी है: उपयोगकर्ता सत्र, ऐप सेटिंग्स, शॉपिंग कार्ट मैनेजर या स्थानीय डेटा कैश।
मुख्य बिंदु
@EnvironmentObject एक property wrapper है जो SwiftUI View को एप्लिकेशन के पर्यावरण से ObservableObject तक पहुँचने की अनुमति देता है। पर्यावरण एक कंटेनर है जिसमें .environmentObject() मॉडिफ़ायर का उपयोग करके View पदानुक्रम के किसी भी स्तर पर ऑब्जेक्ट रखे जा सकते हैं। एक बार ऑब्जेक्ट पर्यावरण में रखे जाने के बाद, कोई भी चाइल्ड View केवल @EnvironmentObject के साथ एक प्रॉपर्टी घोषित करके और ऑब्जेक्ट प्रकार निर्दिष्ट करके इसे एक्सेस कर सकता है।
@EnvironmentObject का मुख्य उद्देश्य प्रत्येक मध्यवर्ती स्तर के माध्यम से ऑब्जेक्ट पास किए बिना गहरे View पदानुक्रम के माध्यम से डेटा पास करने की समस्या को हल करना है। NavigationStack, TabView और मोडल विंडो की शाखाओं वाले जटिल एप्लिकेशन में, @EnvironmentObject बॉयलरप्लेट कोड को समाप्त करके आर्किटेक्चर को काफी सरल बनाता है।
Apple Developer Documentation — Environment (2025) के अनुसार, @EnvironmentObject PreferenceKey और View पहचान पर आधारित एक आंतरिक SwiftUI तंत्र का उपयोग करता है। प्रत्येक View अपने स्वयं के पर्यावरण का एक संदर्भ संग्रहीत करता है, जो पैरेंट View से विरासत में मिलता है और .environmentObject() का उपयोग करके विस्तारित किया जा सकता है। ऑब्जेक्ट की खोज रूट View तक पदानुक्रम में ऊपर जाती है।
class UserSession: ObservableObject {
@Published var isLoggedIn = false
@Published var userName: String = ""
func login(name: String) {
userName = name
isLoggedIn = true
}
}
@main
struct MyApp: App {
@StateObject var session = UserSession()
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(session)
}
}
}
@EnvironmentObject SwiftUI में निर्मित डिपेंडेंसी इंजेक्शन (DI) तंत्र पर आधारित है। जब आप किसी View पर .environmentObject() कॉल करते हैं, तो SwiftUI ऑब्जेक्ट को उस View और उसके सभी वंशजों से जुड़े एक विशेष स्टोरेज में संग्रहीत करता है। जब कोई चाइल्ड View उसी प्रकार का @EnvironmentObject घोषित करता है, तो SwiftUI पैरेंट पदानुक्रम में ऊपर चढ़ते हुए पर्यावरण में ऑब्जेक्ट की खोज करता है।
एक महत्वपूर्ण विशेषता — ऑब्जेक्ट प्रकार का उपयोग पर्यावरण में खोज के लिए कुंजी के रूप में किया जाता है। यदि पर्यावरण में एक ही प्रकार की दो ऑब्जेक्ट मौजूद हैं, तो SwiftUI पदानुक्रम में वर्तमान View के सबसे निकटतम ऑब्जेक्ट ढूंढता है। जब WindowGroup स्तर पर ऑब्जेक्ट इंजेक्ट किया जाता है, तो यह एप्लिकेशन की सभी स्क्रीनों के लिए वैश्विक रूप से उपलब्ध हो जाता है, जो सामान्य-उद्देश्य सेवाओं के लिए सुविधाजनक है।
objc.io — SwiftUI Architecture (2025) के अनुसार, आंतरिक रूप से @EnvironmentObject @ObservedObject के समान तंत्र का उपयोग करता है, लेकिन पदानुक्रम में ऑब्जेक्ट खोजने के लिए अतिरिक्त अमूर्त स्तर के साथ। SwiftUI ऑब्जेक्ट की प्रतिलिपि नहीं बनाता या नया नहीं बनाता — यह मौजूदा इंस्टेंस का संदर्भ पास करता है, इसलिए ऑब्जेक्ट में परिवर्तन स्वचालित रूप से @EnvironmentObject का उपयोग करने वाले सभी View को दिखाई देते हैं।
@EnvironmentObject और @ObservedObject दोनों एक ही मूल कार्य करते हैं — वे ObservableObject में परिवर्तनों के लिए View को सब्सक्राइब करते हैं। अंतर ऑब्जेक्ट पास करने के तंत्र में है। @ObservedObject को इनिशियलाइज़र के माध्यम से स्पष्ट पासिंग की आवश्यकता होती है, जबकि @EnvironmentObject प्रत्येक मध्यवर्ती View में स्पष्ट निर्दिष्टीकरण के बिना पर्यावरण से ऑब्जेक्ट प्राप्त करता है।
| विशेषता | @EnvironmentObject | @ObservedObject |
|---|---|---|
| पासिंग | पदानुक्रम स्तर पर .environmentObject() के माध्यम से | प्रत्येक View के इनिशियलाइज़र के माध्यम से |
| डिपेंडेंसी दृश्यता | छिपी — View हस्ताक्षर में दिखाई नहीं देती | स्पष्ट — View init में दिखाई देती है |
| मध्यवर्ती View | ऑब्जेक्ट के बारे में नहीं जानते | ऑब्जेक्ट को आगे पास करना होगा |
| त्रुटि जोखिम | ऑब्जेक्ट गायब होने पर Runtime crash | Compile-time जाँच (यदि पैरामीटर अनिवार्य है) |
| Prop drilling | समाप्त करता है | मैन्युअल पासिंग की आवश्यकता है |
@EnvironmentObject और @ObservedObject के बीच चुनाव आर्किटेक्चर पर निर्भर करता है। यदि ऑब्जेक्ट पदानुक्रम में गहराई में और कई स्क्रीनों पर आवश्यक है — @EnvironmentObject अधिक सुविधाजनक है। यदि आर्किटेक्चर को परीक्षण और पठनीयता के लिए डिपेंडेंसी के स्पष्ट निर्दिष्टीकरण की आवश्यकता है — @ObservedObject बेहतर है।
सबसे सामान्य परिदृश्य एक उपयोगकर्ता सत्र है जो एप्लिकेशन की सभी स्क्रीनों पर सुलभ होना चाहिए। एप्लिकेशन की जड़ में .environmentObject() के माध्यम से UserSession इंजेक्ट करके, कोई भी स्क्रीन उपयोगकर्ता डेटा और प्राधिकरण स्थिति तक पहुँच सकती है।
struct ProfileView: View {
@EnvironmentObject var session: UserSession
var body: some View {
VStack {
if session.isLoggedIn {
Text("Hello, \(session.userName)")
Button("Logout") {
session.isLoggedIn = false
}
} else {
LoginView()
}
}
}
}
struct SettingsView: View {
@EnvironmentObject var session: UserSession
var body: some View {
Form {
Text("Logged in as \(session.userName)")
}
}
}
ध्यान दें कि न तो ProfileView और न ही SettingsView इनिशियलाइज़र के माध्यम से सत्र प्राप्त करते हैं। वे बस @EnvironmentObject var session: UserSession घोषित करते हैं, और SwiftUI स्वचालित रूप से पर्यावरण में ऑब्जेक्ट ढूंढता है। यह मौजूदा डेटा-पासिंग कोड को बदले बिना नई स्क्रीन जोड़ने की अनुमति देता है।
@EnvironmentObject का मुख्य जोखिम runtime crash है यदि ऑब्जेक्ट पर्यावरण में इंजेक्ट नहीं किया गया है। वैकल्पिक पैरामीटर के विपरीत, @EnvironmentObject nil नहीं हो सकता। यदि @EnvironmentObject वाला View स्क्रीन पर दिखाई देता है और पैरेंट View ने उस प्रकार के लिए .environmentObject() कॉल नहीं किया है, तो ऐप तुरंत “Fatal error: No ObservableObject of type X found” के साथ क्रैश हो जाता है।
यदि आप पदानुक्रम के विभिन्न स्तरों पर एक ही प्रकार की दो ऑब्जेक्ट इंजेक्ट करते हैं, तो चाइल्ड View पदानुक्रम के अनुसार सबसे निकटतम प्राप्त करेगा। यह भ्रम पैदा कर सकता है यदि डेवलपर उम्मीद करता है कि रूट पर्यावरण की ऑब्जेक्ट एक मोडल विंडो में उपलब्ध होगी जिसका अपना पर्यावरण उसी प्रकार की ऑब्जेक्ट के साथ है।
SwiftUI के विकास के साथ, डिपेंडेंसी प्रबंधन के वैकल्पिक तरीके सामने आए हैं जो @EnvironmentObject की कुछ कमियों को दूर करते हैं — मुख्य रूप से डिपेंडेंसी की अंतर्निहितता और runtime crash का जोखिम।
दृष्टिकोण का चुनाव टीम के आकार और एप्लिकेशन की जटिलता पर निर्भर करता है। छोटे प्रोजेक्ट के लिए, @EnvironmentObject बहुत अच्छा काम करता है। बड़े प्रोजेक्ट के लिए जिनमें दर्जनों स्क्रीन और सख्त परीक्षण आवश्यकताएँ हैं, @ObservedObject या DI कंटेनर के माध्यम से स्पष्ट पासिंग बेहतर है।
अक्सर पूछे जाने वाले प्रश्न
हाँ, एक View विभिन्न प्रकारों के जितने चाहें उतने @EnvironmentObject घोषित कर सकता है। SwiftUI प्रत्येक प्रकार को पर्यावरण में स्वतंत्र रूप से खोजता है। यह तब सुविधाजनक है जब View को एक साथ उपयोगकर्ता सत्र, सेटिंग्स और शॉपिंग कार्ट तक पहुँच की आवश्यकता होती है — प्रत्येक ऑब्जेक्ट अलग से इंजेक्ट की जाती है।
View प्रदर्शित करने का प्रयास करते समय Preview runtime error के साथ क्रैश हो जाएगा। @EnvironmentObject का उपयोग करने वाले View के लिए Preview में हमेशा .environmentObject() जोड़ें। परीक्षण डेटा के साथ मॉक ऑब्जेक्ट का उपयोग करें ताकि Preview सही ढंग से काम करे और यथार्थवादी स्थिति दिखाए।
नहीं, @EnvironmentObject केवल ObservableObject के अनुरूप एक ठोस वर्ग प्रकार के साथ काम करता है। प्रोटोकॉल के लिए आपको type erasure या रैपर का उपयोग करना होगा: एक रैपर वर्ग बनाएँ जो प्रोटोकॉल-टाइप ऑब्जेक्ट का संदर्भ रखता है, और रैपर को @EnvironmentObject के माध्यम से इंजेक्ट करें।
परीक्षण डेटा के साथ एक ObservableObject इंस्टेंस बनाएँ और इसे परीक्षण में .environmentObject(testObject) के माध्यम से View को पास करें। SwiftUI UI परीक्षण के लिए यह मानक पैटर्न है। यूनिट परीक्षण के लिए, तर्क को ObservableObject में अलग करें और View से अलग इसका परीक्षण करें।
@EnvironmentObject कोई अतिरिक्त प्रदर्शन भार नहीं बनाता क्योंकि यह केवल ऑब्जेक्ट का संदर्भ पास करता है, प्रतिलिपि नहीं। हालाँकि, वैश्विक ऑब्जेक्ट में @Published गुणों के बार-बार अपडेट से कई View एक साथ पुनः रेंडर हो सकते हैं, जो प्रदर्शन को प्रभावित कर सकता है।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें