@EnvironmentObject: यह क्या है, डिपेंडेंसी इंजेक्शन और डेटा एक्सेस

लेखक: IT Sectr प्रकाशित: 2026-06-26 पढ़ने का समय: 9 मिनट

@EnvironmentObject SwiftUI में एक property wrapper है जो पदानुक्रम में किसी भी View को इनिशियलाइज़र की श्रृंखला के माध्यम से स्पष्ट रूप से पास किए बिना ObservableObject तक पहुँचने की अनुमति देता है। ऑब्जेक्ट को .environmentObject() मॉडिफ़ायर का उपयोग करके पदानुक्रम के एक विशिष्ट स्तर पर पर्यावरण में इंजेक्ट किया जाता है, जिसके बाद सभी चाइल्ड View इसे @EnvironmentObject के माध्यम से प्राप्त कर सकते हैं। यह मध्यवर्ती View के माध्यम से ऑब्जेक्ट पास करने की आवश्यकता को समाप्त करता है जो इसका उपयोग नहीं करते — तथाकथित prop drilling। जॉन सुंडेल — Swift by Sundell (2025) के लेख के अनुसार, @EnvironmentObject क्रॉस-स्क्रीन डेटा के लिए विशेष रूप से उपयोगी है: उपयोगकर्ता सत्र, ऐप सेटिंग्स, शॉपिंग कार्ट मैनेजर या स्थानीय डेटा कैश।

मुख्य बिंदु

  • @EnvironmentObject — SwiftUI पर्यावरण से ObservableObject तक पहुँचने के लिए property wrapper।
  • .environmentObject() के माध्यम से इंजेक्शन — ऑब्जेक्ट पदानुक्रम में एक बार पास किया जाता है, सभी चाइल्ड View के लिए उपलब्ध।
  • कोई स्पष्ट पासिंग नहीं — मध्यवर्ती View को ऑब्जेक्ट के बारे में जानने की आवश्यकता नहीं है, जो आर्किटेक्चर को सरल बनाता है।
  • Runtime crash — यदि ऑब्जेक्ट पर्यावरण में नहीं मिलता है, तो ऐप fatal error के साथ क्रैश हो जाता है।
  • iOS 13+ — @EnvironmentObject SwiftUI के पहले संस्करण से उपलब्ध है।

SwiftUI में @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 तक पदानुक्रम में ऊपर जाती है।

swift
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 कैसे काम करता है

@EnvironmentObject SwiftUI में निर्मित डिपेंडेंसी इंजेक्शन (DI) तंत्र पर आधारित है। जब आप किसी View पर .environmentObject() कॉल करते हैं, तो SwiftUI ऑब्जेक्ट को उस View और उसके सभी वंशजों से जुड़े एक विशेष स्टोरेज में संग्रहीत करता है। जब कोई चाइल्ड View उसी प्रकार का @EnvironmentObject घोषित करता है, तो SwiftUI पैरेंट पदानुक्रम में ऊपर चढ़ते हुए पर्यावरण में ऑब्जेक्ट की खोज करता है।

एक महत्वपूर्ण विशेषता — ऑब्जेक्ट प्रकार का उपयोग पर्यावरण में खोज के लिए कुंजी के रूप में किया जाता है। यदि पर्यावरण में एक ही प्रकार की दो ऑब्जेक्ट मौजूद हैं, तो SwiftUI पदानुक्रम में वर्तमान View के सबसे निकटतम ऑब्जेक्ट ढूंढता है। जब WindowGroup स्तर पर ऑब्जेक्ट इंजेक्ट किया जाता है, तो यह एप्लिकेशन की सभी स्क्रीनों के लिए वैश्विक रूप से उपलब्ध हो जाता है, जो सामान्य-उद्देश्य सेवाओं के लिए सुविधाजनक है।

objc.io — SwiftUI Architecture (2025) के अनुसार, आंतरिक रूप से @EnvironmentObject @ObservedObject के समान तंत्र का उपयोग करता है, लेकिन पदानुक्रम में ऑब्जेक्ट खोजने के लिए अतिरिक्त अमूर्त स्तर के साथ। SwiftUI ऑब्जेक्ट की प्रतिलिपि नहीं बनाता या नया नहीं बनाता — यह मौजूदा इंस्टेंस का संदर्भ पास करता है, इसलिए ऑब्जेक्ट में परिवर्तन स्वचालित रूप से @EnvironmentObject का उपयोग करने वाले सभी View को दिखाई देते हैं।

पर्यावरण में ऑब्जेक्ट की खोज

  • वर्तमान View से ऊपर की ओर — SwiftUI वर्तमान View के पर्यावरण की जाँच करता है, फिर पैरेंट की, और इसी तरह रूट तक।
  • पहली मिलने वाली ऑब्जेक्ट — पदानुक्रम में ऊपर चढ़ने पर मिलने वाली पहली मेल खाने वाली ऑब्जेक्ट का उपयोग किया जाता है।
  • Fatal error — यदि किसी भी स्तर पर कोई ऑब्जेक्ट नहीं मिलती है, तो ऐप “No ObservableObject found” के साथ क्रैश हो जाता है।

@EnvironmentObject बनाम @ObservedObject: तुलना

@EnvironmentObject और @ObservedObject दोनों एक ही मूल कार्य करते हैं — वे ObservableObject में परिवर्तनों के लिए View को सब्सक्राइब करते हैं। अंतर ऑब्जेक्ट पास करने के तंत्र में है। @ObservedObject को इनिशियलाइज़र के माध्यम से स्पष्ट पासिंग की आवश्यकता होती है, जबकि @EnvironmentObject प्रत्येक मध्यवर्ती View में स्पष्ट निर्दिष्टीकरण के बिना पर्यावरण से ऑब्जेक्ट प्राप्त करता है।

विशेषता@EnvironmentObject@ObservedObject
पासिंगपदानुक्रम स्तर पर .environmentObject() के माध्यम सेप्रत्येक View के इनिशियलाइज़र के माध्यम से
डिपेंडेंसी दृश्यताछिपी — View हस्ताक्षर में दिखाई नहीं देतीस्पष्ट — View init में दिखाई देती है
मध्यवर्ती Viewऑब्जेक्ट के बारे में नहीं जानतेऑब्जेक्ट को आगे पास करना होगा
त्रुटि जोखिमऑब्जेक्ट गायब होने पर Runtime crashCompile-time जाँच (यदि पैरामीटर अनिवार्य है)
Prop drillingसमाप्त करता हैमैन्युअल पासिंग की आवश्यकता है

@EnvironmentObject और @ObservedObject के बीच चुनाव आर्किटेक्चर पर निर्भर करता है। यदि ऑब्जेक्ट पदानुक्रम में गहराई में और कई स्क्रीनों पर आवश्यक है — @EnvironmentObject अधिक सुविधाजनक है। यदि आर्किटेक्चर को परीक्षण और पठनीयता के लिए डिपेंडेंसी के स्पष्ट निर्दिष्टीकरण की आवश्यकता है — @ObservedObject बेहतर है।

@EnvironmentObject उपयोग के उदाहरण

सबसे सामान्य परिदृश्य एक उपयोगकर्ता सत्र है जो एप्लिकेशन की सभी स्क्रीनों पर सुलभ होना चाहिए। एप्लिकेशन की जड़ में .environmentObject() के माध्यम से UserSession इंजेक्ट करके, कोई भी स्क्रीन उपयोगकर्ता डेटा और प्राधिकरण स्थिति तक पहुँच सकती है।

swift
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” के साथ क्रैश हो जाता है।

क्रैश से कैसे बचें

  • वैश्विक इंजेक्शन — ऑब्जेक्ट को उच्चतम स्तर (WindowGroup) पर इंजेक्ट करें ताकि यह सभी स्क्रीनों के लिए उपलब्ध हो।
  • Preview में जाँच — SwiftUI Preview में हमेशा .environmentObject() जोड़ें, अन्यथा Preview क्रैश हो जाएगा।
  • दस्तावेज़ीकरण और परीक्षण — दस्तावेज़ित करें कि View किस @EnvironmentObject की अपेक्षा करता है, और उनकी उपस्थिति सत्यापित करने वाले परीक्षण लिखें।
  • @ObservedObject से बदलें — यदि ऑब्जेक्ट केवल एक स्क्रीन के लिए आवश्यक है, तो स्पष्ट पासिंग के साथ @ObservedObject का उपयोग करें।

एकाधिक इंस्टेंस की समस्या

यदि आप पदानुक्रम के विभिन्न स्तरों पर एक ही प्रकार की दो ऑब्जेक्ट इंजेक्ट करते हैं, तो चाइल्ड View पदानुक्रम के अनुसार सबसे निकटतम प्राप्त करेगा। यह भ्रम पैदा कर सकता है यदि डेवलपर उम्मीद करता है कि रूट पर्यावरण की ऑब्जेक्ट एक मोडल विंडो में उपलब्ध होगी जिसका अपना पर्यावरण उसी प्रकार की ऑब्जेक्ट के साथ है।

@EnvironmentObject के विकल्प

SwiftUI के विकास के साथ, डिपेंडेंसी प्रबंधन के वैकल्पिक तरीके सामने आए हैं जो @EnvironmentObject की कुछ कमियों को दूर करते हैं — मुख्य रूप से डिपेंडेंसी की अंतर्निहितता और runtime crash का जोखिम।

  • @Environment property wrapper — अंतर्निहित पर्यावरण मानों (colorScheme, locale, sizeCategory) के लिए। कस्टम ObservableObject के लिए उपयुक्त नहीं, केवल मानक EnvironmentValues कुंजियों के लिए।
  • Custom EnvironmentKey — आप मान प्रकारों के लिए एक कस्टम पर्यावरण कुंजी घोषित कर सकते हैं। संदर्भ शब्दार्थ के कारण ObservableObject को EnvironmentValues में संग्रहीत करने की अनुशंसा नहीं की जाती है।
  • स्पष्ट पासिंग के साथ @ObservedObject — compile-time जाँच के साथ एक सुरक्षित दृष्टिकोण। कोई View आवश्यक ऑब्जेक्ट के बिना प्रकट नहीं हो सकता — इसे init के माध्यम से पास किया जाना चाहिए।
  • डिपेंडेंसी इंजेक्शन कंटेनर — SwiftUI के बाहर डिपेंडेंसी प्रबंधित करने के लिए एक बाहरी DI कंटेनर (जैसे Resolver या Swinject)।

दृष्टिकोण का चुनाव टीम के आकार और एप्लिकेशन की जटिलता पर निर्भर करता है। छोटे प्रोजेक्ट के लिए, @EnvironmentObject बहुत अच्छा काम करता है। बड़े प्रोजेक्ट के लिए जिनमें दर्जनों स्क्रीन और सख्त परीक्षण आवश्यकताएँ हैं, @ObservedObject या DI कंटेनर के माध्यम से स्पष्ट पासिंग बेहतर है।

अक्सर पूछे जाने वाले प्रश्न

क्या मैं एक View में कई @EnvironmentObject का उपयोग कर सकता हूँ?

हाँ, एक View विभिन्न प्रकारों के जितने चाहें उतने @EnvironmentObject घोषित कर सकता है। SwiftUI प्रत्येक प्रकार को पर्यावरण में स्वतंत्र रूप से खोजता है। यह तब सुविधाजनक है जब View को एक साथ उपयोगकर्ता सत्र, सेटिंग्स और शॉपिंग कार्ट तक पहुँच की आवश्यकता होती है — प्रत्येक ऑब्जेक्ट अलग से इंजेक्ट की जाती है।

क्या होगा यदि मैं Preview में .environmentObject() के बिना @EnvironmentObject इंजेक्ट करूँ?

View प्रदर्शित करने का प्रयास करते समय Preview runtime error के साथ क्रैश हो जाएगा। @EnvironmentObject का उपयोग करने वाले View के लिए Preview में हमेशा .environmentObject() जोड़ें। परीक्षण डेटा के साथ मॉक ऑब्जेक्ट का उपयोग करें ताकि Preview सही ढंग से काम करे और यथार्थवादी स्थिति दिखाए।

क्या मैं प्रोटोकॉल के साथ @EnvironmentObject का उपयोग कर सकता हूँ?

नहीं, @EnvironmentObject केवल ObservableObject के अनुरूप एक ठोस वर्ग प्रकार के साथ काम करता है। प्रोटोकॉल के लिए आपको type erasure या रैपर का उपयोग करना होगा: एक रैपर वर्ग बनाएँ जो प्रोटोकॉल-टाइप ऑब्जेक्ट का संदर्भ रखता है, और रैपर को @EnvironmentObject के माध्यम से इंजेक्ट करें।

मैं @EnvironmentObject का उपयोग करने वाले View का परीक्षण कैसे करूँ?

परीक्षण डेटा के साथ एक ObservableObject इंस्टेंस बनाएँ और इसे परीक्षण में .environmentObject(testObject) के माध्यम से View को पास करें। SwiftUI UI परीक्षण के लिए यह मानक पैटर्न है। यूनिट परीक्षण के लिए, तर्क को ObservableObject में अलग करें और View से अलग इसका परीक्षण करें।

क्या @EnvironmentObject कई स्क्रीनों पर प्रदर्शन को प्रभावित करता है?

@EnvironmentObject कोई अतिरिक्त प्रदर्शन भार नहीं बनाता क्योंकि यह केवल ऑब्जेक्ट का संदर्भ पास करता है, प्रतिलिपि नहीं। हालाँकि, वैश्विक ऑब्जेक्ट में @Published गुणों के बार-बार अपडेट से कई View एक साथ पुनः रेंडर हो सकते हैं, जो प्रदर्शन को प्रभावित कर सकता है।

सारांश

  • @EnvironmentObject — इनिशियलाइज़र के माध्यम से स्पष्ट पासिंग के बिना SwiftUI पर्यावरण से ObservableObject तक पहुँचने के लिए property wrapper।
  • .environmentObject() के माध्यम से इंजेक्शन — ऑब्जेक्ट को एक विशिष्ट पदानुक्रम स्तर पर पर्यावरण में रखा जाता है।
  • स्वचालित खोज — SwiftUI प्रकार को कुंजी के रूप में उपयोग करके पदानुक्रम में ऊपर ऑब्जेक्ट की खोज करता है।
  • Runtime crash — यदि ऑब्जेक्ट नहीं मिलती है, तो ऐप fatal error के साथ क्रैश हो जाता है, जिसमें सावधानी आवश्यक है।
  • Prop drilling का समाधान — @EnvironmentObject मध्यवर्ती View के माध्यम से डेटा पास करने की आवश्यकता को समाप्त करता है।
  • अंतर्निहित डिपेंडेंसी — डिपेंडेंसी View हस्ताक्षर में दिखाई नहीं देती, जिससे कोड को समझना कठिन हो जाता है।
  • विकल्प — स्पष्ट पासिंग के लिए @ObservedObject, बड़े प्रोजेक्ट के लिए DI कंटेनर।

हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे

IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।

परियोजना पर चर्चा करें

यह भी पढ़ें