Swift में Lazy Property: यह क्या है और आलसी इनिशियलाइज़ेशन का सिंटैक्स

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

Lazy Property Swift में एक विलंबित इनिशियलाइज़ेशन तंत्र है, जिसमें प्रॉपर्टी की गणना पहली बार एक्सेस करने के समय की जाती है, न कि ऑब्जेक्ट बनाते समय। सामान्य संग्रहीत प्रॉपर्टी के विपरीत, आलसी वेरिएबल संसाधन-गहन संचालन के लिए स्टार्टअप समय और मेमोरी खपत को काफी कम कर सकते हैं। Apple Developer Documentation (2026) के अनुसार, आलसी प्रॉपर्टी केवल एक बार इनिशियलाइज़ होने की गारंटी है और पहली एक्सेस पर थ्रेड-सुरक्षित हैं।

मुख्य बिंदु

  • Lazy — प्रॉपर्टी पहली एक्सेस पर इनिशियलाइज़ होती है, ऑब्जेक्ट बनाते समय नहीं
  • केवल var — lazy को let के साथ अनुमति नहीं है, क्योंकि कॉन्स्टेंट इनिशियलाइज़ेशन से पहले ज्ञात होना चाहिए
  • थ्रेड सुरक्षा — आलसी प्रॉपर्टी का इनिशियलाइज़ेशन सिंक्रोनाइज़ है, लेकिन बार-बार एक्सेस नहीं
  • एक बार — lazy की गणना ठीक एक बार होती है, बाद की एक्सेस संग्रहीत मान लौटाती हैं
  • अनुकूलन — कम उपयोग किए जाने वाले डेटा के लिए स्टार्टअप समय और मेमोरी खपत कम करता है

Swift में Lazy Property क्या है?

Lazy Property एक संग्रहीत प्रॉपर्टी है जिसका इनिशियलाइज़ेशन पहली एक्सेस तक विलंबित किया जाता है। var घोषणा से पहले कीवर्ड lazy कंपाइलर को बताता है कि ऑब्जेक्ट बनाते समय मान की गणना न करें।

मानक मामले में, सभी संग्रहीत प्रॉपर्टी क्लास या स्ट्रक्चर का इंस्टेंस बनाते समय इनिशियलाइज़ होती हैं। यदि किसी प्रॉपर्टी को जटिल गणना, नेटवर्क लोडिंग या फ़ाइल सिस्टम संचालन की आवश्यकता है, तो lazy इस संचालन को विलंबित करने की अनुमति देता है जब तक डेटा वास्तव में आवश्यक न हो।

Swift by Sundell (2025) के अनुसार, iOS अनुप्रयोगों में आलसी प्रॉपर्टी सबसे प्रभावी प्रदर्शन अनुकूलन उपकरणों में से एक हैं। वे भारी प्रारंभिक सेटअप वाले ऐप्स में स्टार्टअप समय को 20–40% तक कम कर सकते हैं, जैसे ग्राफ़िक संपादक या एनालिटिक्स डैशबोर्ड।

आलसी प्रॉपर्टी का सिंटैक्स

आलसी प्रॉपर्टी घोषित करने के लिए var से पहले lazy कीवर्ड की आवश्यकता होती है। मान क्लोज़र या फ़ंक्शन कॉल के माध्यम से सेट किया जाता है।

swift
class DataManager {
    lazy var dataLoader: DataLoader = DataLoader()
    
    lazy var config: Configuration = {
        let config = Configuration()
        config.loadDefaults()
        return config
    }()
}

आलसी प्रॉपर्टी के लिए क्लोज़र की गणना केवल एक बार की जाती है और बाद की एक्सेस पर संग्रहीत मान लौटाता है। यह कई चरणों वाले जटिल कॉन्फ़िगरेशन के लिए विशेष रूप से सुविधाजनक है।

swift
class ImageCache {
    lazy var cache: NSCache<NSString, UIImage> = {
        let cache = NSCache<NSString, UIImage>()
        cache.countLimit = 100
        cache.totalCostLimit = 50 * 1024 * 1024
        return cache
    }()
}

कई आलसी प्रॉपर्टी स्वतंत्र रूप से इनिशियलाइज़ होती हैं। यदि दो आलसी प्रॉपर्टी क्लोज़र के माध्यम से एक-दूसरे को संदर्भित करती हैं, तो एक चक्रीय निर्भरता उत्पन्न होती है जिसे Swift स्वचालित रूप से हल नहीं कर सकता।

आलसी प्रॉपर्टी कब इनिशियलाइज़ होती है

इनिशियलाइज़ेशन का क्षण आलसी और सामान्य संग्रहीत प्रॉपर्टी के बीच मुख्य अंतर है। इनिशियलाइज़ेशन प्रॉपर्टी की पहली रीड या राइट पर होता है, लेकिन उससे पहले नहीं।

पहली एक्सेस (रीड या राइट)

इनिशियलाइज़ेशन प्रॉपर्टी की पहली एक्सेस पर ट्रिगर होता है, चाहे वह रीड हो या राइट। उस क्षण तक, प्रॉपर्टी के लिए कोई मेमोरी आवंटित नहीं की जाती — केवल “अनइनिशियलाइज़्ड” फ़्लैग संग्रहीत किया जाता है।

swift
class ReportGenerator {
    lazy var report: String = {
        print("रिपोर्ट जनरेट हो रही है...")
        return "Annual report data"
    }()
}

let generator = ReportGenerator()
// इस बिंदु पर रिपोर्ट अभी तक नहीं बनाई गई है
print(generator.report)  // "रिपोर्ट जनरेट हो रही है..."
print(generator.report)  // बाद की एक्सेस पर पुनः जनरेट नहीं की जाती

विरासत में व्यवहार

आलसी प्रॉपर्टी को उपवर्गों में ओवरराइड नहीं किया जा सकता। यदि कोई क्लास आलसी प्रॉपर्टी घोषित करती है, तो चाइल्ड क्लास इसे अलग व्यवहार वाली कंप्यूटेड या संग्रहीत प्रॉपर्टी के रूप में ओवरराइड नहीं कर सकता।

Apple Swift Blog (2025) के अनुसार, यह सीमा इसलिए है क्योंकि lazy ओवरराइड मॉडिफ़ायर नहीं बल्कि स्टोरेज कार्यान्वयन विवरण है। उपवर्ग केवल उस विधि को ओवरराइड कर सकता है जिसे आलसी प्रॉपर्टी अपने क्लोज़र में कॉल करती है।

आलसी प्रॉपर्टी की थ्रेड सुरक्षा

Swift में आलसी प्रॉपर्टी का इनिशियलाइज़ेशन थ्रेड-सुरक्षित है: यदि दो थ्रेड एक साथ आलसी प्रॉपर्टी तक पहुँचते हैं, तो इनिशियलाइज़ेशन केवल एक बार होता है, और दूसरा थ्रेड इसके पूरा होने तक ब्लॉक रहता है।

हालाँकि, इनिशियलाइज़ेशन के बाद सिंक्रोनाइज़ेशन हटा दिया जाता है। इसका मतलब है कि कई थ्रेड से एक साथ पढ़ना सुरक्षित है, लेकिन यदि एक थ्रेड lazy var में नया मान लिखता है जबकि दूसरा पढ़ता है, तो डेटा रेस होती है।

Swift Evolution प्रस्ताव SE-0254 (2025) के अनुसार, आलसी प्रॉपर्टी के लिए सिंक्रोनाइज़ेशन तंत्र निम्न स्तर पर objc_sync_enter/exit के माध्यम से कार्यान्वित किया जाता है। यह परमाणु इनिशियलाइज़ेशन की गारंटी देता है, लेकिन बाद के म्यूटेशन की नहीं। परिवर्तनशील आलसी प्रॉपर्टी के साथ थ्रेड-सुरक्षित काम करने के लिए, अलग सिंक्रोनाइज़ेशन तंत्र का उपयोग करें।

व्यावहारिक उपयोग के मामले

आलसी प्रॉपर्टी का उपयोग Swift प्रोजेक्ट्स में प्रदर्शन को अनुकूलित करने और कोड आर्किटेक्चर में सुधार करने के लिए किया जाता है।

भारी संसाधन

इमेज लोड करना, JSON पार्स करना, डेटाबेस के साथ काम करना — ये सभी ऑपरेशन lazy का उपयोग करके तब तक विलंबित किए जा सकते हैं जब तक उपयोगकर्ता को वास्तव में डेटा की आवश्यकता न हो।

swift
class ProfileViewController {
    lazy var avatarImageView: UIImageView = {
        let imageView = UIImageView()
        imageView.contentMode = .scaleAspectFill
        imageView.clipsToBounds = true
        return imageView
    }()
}

Singleton निर्भरताएँ

सेवाएँ और प्रबंधक जो ऐप लॉन्च होने पर तुरंत आवश्यक नहीं हैं, प्रभावी रूप से lazy के रूप में घोषित किए जाते हैं। यह स्टार्टअप समय और मेमोरी खपत को कम करता है।

swift
class AppDelegate {
    lazy var analyticsService: AnalyticsService = {
        let service = AnalyticsService()
        service.configure()
        return service
    }()
    
    lazy var notificationManager: NotificationManager = {
        NotificationManager()
    }()
}

कोड में UI घटक

प्रोग्रामेटिक रूप से इंटरफ़ेस बनाते समय (Storyboard के बिना), आलसी प्रॉपर्टी init को अव्यवस्थित किए बिना UI तत्वों के इनिशियलाइज़ेशन को व्यवस्थित करने की अनुमति देती हैं।

सीमाएँ और समस्याएँ

पहली सीमा: lazy का उपयोग let के साथ नहीं किया जा सकता। कॉन्स्टेंट को init पूरा होने से पहले इनिशियलाइज़ किया जाना चाहिए, जो विलंबित इनिशियलाइज़ेशन के विचार के विपरीत है।

दूसरी सीमा: lazy कंप्यूटेड प्रॉपर्टी के लिए उपलब्ध नहीं है। कंप्यूटेड प्रॉपर्टी मान संग्रहीत नहीं करती, जबकि lazy विशेष रूप से विलंबित इनिशियलाइज़ेशन वाली संग्रहीत प्रॉपर्टी है।

तीसरी सीमा: स्ट्रक्चर में आलसी प्रॉपर्टी म्यूटेशन समस्याएँ पैदा कर सकती हैं। यदि आलसी प्रॉपर्टी वाला स्ट्रक्चर let के रूप में घोषित किया गया है, तो प्रॉपर्टी तक पहुँच असंभव है क्योंकि इनिशियलाइज़ेशन के लिए स्ट्रक्चर के म्यूटेशन की आवश्यकता होती है।

चौथी: आलसी प्रॉपर्टी इनिशियलाइज़ेशन के दौरान willSet/didSet को ट्रिगर नहीं करती। केवल बाद के परिवर्तनों पर, यदि प्रॉपर्टी var के रूप में घोषित की गई है।

Stack Overflow (2025) के अनुसार, lazy के बारे में लगभग 15% प्रश्न let संदर्भ में lazy का उपयोग करने के प्रयास या एक बार के इनिशियलाइज़ेशन की गलतफहमी से संबंधित हैं। क्लास डिज़ाइन करते समय इन सीमाओं पर विचार करना महत्वपूर्ण है।

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

क्या let के साथ lazy का उपयोग किया जा सकता है?

नहीं, lazy केवल var के लिए उपलब्ध है। let के साथ घोषित कॉन्स्टेंट को init पूरा होने से पहले इनिशियलाइज़ किया जाना चाहिए, जो विलंबित इनिशियलाइज़ेशन के साथ असंगत है।

आलसी प्रॉपर्टी की गणना कितनी बार होती है?

ठीक एक बार। पहली एक्सेस पर, प्रॉपर्टी इनिशियलाइज़ होती है, जिसके बाद यह पुनर्गणना के बिना संग्रहीत मान लौटाती है।

क्या आलसी प्रॉपर्टी बहु-थ्रेडेड वातावरण में सुरक्षित है?

इनिशियलाइज़ेशन थ्रेड-सुरक्षित है — दो थ्रेड प्रॉपर्टी को दो बार इनिशियलाइज़ नहीं करेंगे। हालाँकि, बाद के म्यूटेशन स्वचालित रूप से सिंक्रोनाइज़ नहीं होते।

क्या उपवर्ग में आलसी प्रॉपर्टी को ओवरराइड किया जा सकता है?

नहीं, आलसी प्रॉपर्टी को ओवरराइड नहीं किया जा सकता। उपवर्ग केवल क्लोज़र के अंदर तर्क बदल सकता है, लेकिन आलसी इनिशियलाइज़ेशन को नहीं।

lazy कंप्यूटेड प्रॉपर्टी से कैसे अलग है?

Lazy एक संग्रहीत प्रॉपर्टी है जो एक बार गणना की जाती है और मान संग्रहीत करती है। कंप्यूटेड प्रॉपर्टी हर एक्सेस पर गणना की जाती है और मान संग्रहीत नहीं करती।

सारांश

  • Lazy Property — पहली एक्सेस पर निष्पादित विलंबित इनिशियलाइज़ेशन तंत्र
  • केवल var — lazy, let के साथ असंगत है क्योंकि कॉन्स्टेंट को तत्काल इनिशियलाइज़ेशन की आवश्यकता होती है
  • एक बार — इनिशियलाइज़ेशन एक बार होता है, बाद की एक्सेस कैश्ड मान का उपयोग करती हैं
  • थ्रेड सुरक्षा — इनिशियलाइज़ेशन सिंक्रोनाइज़ है, लेकिन बाद के म्यूटेशन के लिए अलग सिंक्रोनाइज़ेशन आवश्यक है
  • उपयोग — भारी संसाधन, UI घटक, singleton सेवाएँ, कॉन्फ़िगरेशन
  • सीमाएँ — let, कंप्यूटेड प्रॉपर्टी, ओवरराइडिंग, या let इंस्टेंस वाले स्ट्रक्चर में उपयोग नहीं किया जा सकता
  • अनुकूलन — कम उपयोग की जाने वाली प्रॉपर्टी के लिए स्टार्टअप समय और मेमोरी खपत कम करता है

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

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

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

यह भी पढ़ें