Lazy Property Swift में एक विलंबित इनिशियलाइज़ेशन तंत्र है, जिसमें प्रॉपर्टी की गणना पहली बार एक्सेस करने के समय की जाती है, न कि ऑब्जेक्ट बनाते समय। सामान्य संग्रहीत प्रॉपर्टी के विपरीत, आलसी वेरिएबल संसाधन-गहन संचालन के लिए स्टार्टअप समय और मेमोरी खपत को काफी कम कर सकते हैं। Apple Developer Documentation (2026) के अनुसार, आलसी प्रॉपर्टी केवल एक बार इनिशियलाइज़ होने की गारंटी है और पहली एक्सेस पर थ्रेड-सुरक्षित हैं।
मुख्य बिंदु
Lazy Property एक संग्रहीत प्रॉपर्टी है जिसका इनिशियलाइज़ेशन पहली एक्सेस तक विलंबित किया जाता है। var घोषणा से पहले कीवर्ड lazy कंपाइलर को बताता है कि ऑब्जेक्ट बनाते समय मान की गणना न करें।
मानक मामले में, सभी संग्रहीत प्रॉपर्टी क्लास या स्ट्रक्चर का इंस्टेंस बनाते समय इनिशियलाइज़ होती हैं। यदि किसी प्रॉपर्टी को जटिल गणना, नेटवर्क लोडिंग या फ़ाइल सिस्टम संचालन की आवश्यकता है, तो lazy इस संचालन को विलंबित करने की अनुमति देता है जब तक डेटा वास्तव में आवश्यक न हो।
Swift by Sundell (2025) के अनुसार, iOS अनुप्रयोगों में आलसी प्रॉपर्टी सबसे प्रभावी प्रदर्शन अनुकूलन उपकरणों में से एक हैं। वे भारी प्रारंभिक सेटअप वाले ऐप्स में स्टार्टअप समय को 20–40% तक कम कर सकते हैं, जैसे ग्राफ़िक संपादक या एनालिटिक्स डैशबोर्ड।
आलसी प्रॉपर्टी घोषित करने के लिए var से पहले lazy कीवर्ड की आवश्यकता होती है। मान क्लोज़र या फ़ंक्शन कॉल के माध्यम से सेट किया जाता है।
class DataManager {
lazy var dataLoader: DataLoader = DataLoader()
lazy var config: Configuration = {
let config = Configuration()
config.loadDefaults()
return config
}()
}
आलसी प्रॉपर्टी के लिए क्लोज़र की गणना केवल एक बार की जाती है और बाद की एक्सेस पर संग्रहीत मान लौटाता है। यह कई चरणों वाले जटिल कॉन्फ़िगरेशन के लिए विशेष रूप से सुविधाजनक है।
class ImageCache {
lazy var cache: NSCache<NSString, UIImage> = {
let cache = NSCache<NSString, UIImage>()
cache.countLimit = 100
cache.totalCostLimit = 50 * 1024 * 1024
return cache
}()
}
कई आलसी प्रॉपर्टी स्वतंत्र रूप से इनिशियलाइज़ होती हैं। यदि दो आलसी प्रॉपर्टी क्लोज़र के माध्यम से एक-दूसरे को संदर्भित करती हैं, तो एक चक्रीय निर्भरता उत्पन्न होती है जिसे 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 का उपयोग करके तब तक विलंबित किए जा सकते हैं जब तक उपयोगकर्ता को वास्तव में डेटा की आवश्यकता न हो।
class ProfileViewController {
lazy var avatarImageView: UIImageView = {
let imageView = UIImageView()
imageView.contentMode = .scaleAspectFill
imageView.clipsToBounds = true
return imageView
}()
}
सेवाएँ और प्रबंधक जो ऐप लॉन्च होने पर तुरंत आवश्यक नहीं हैं, प्रभावी रूप से lazy के रूप में घोषित किए जाते हैं। यह स्टार्टअप समय और मेमोरी खपत को कम करता है।
class AppDelegate {
lazy var analyticsService: AnalyticsService = {
let service = AnalyticsService()
service.configure()
return service
}()
lazy var notificationManager: NotificationManager = {
NotificationManager()
}()
}
प्रोग्रामेटिक रूप से इंटरफ़ेस बनाते समय (Storyboard के बिना), आलसी प्रॉपर्टी init को अव्यवस्थित किए बिना UI तत्वों के इनिशियलाइज़ेशन को व्यवस्थित करने की अनुमति देती हैं।
पहली सीमा: lazy का उपयोग let के साथ नहीं किया जा सकता। कॉन्स्टेंट को init पूरा होने से पहले इनिशियलाइज़ किया जाना चाहिए, जो विलंबित इनिशियलाइज़ेशन के विचार के विपरीत है।
दूसरी सीमा: lazy कंप्यूटेड प्रॉपर्टी के लिए उपलब्ध नहीं है। कंप्यूटेड प्रॉपर्टी मान संग्रहीत नहीं करती, जबकि lazy विशेष रूप से विलंबित इनिशियलाइज़ेशन वाली संग्रहीत प्रॉपर्टी है।
तीसरी सीमा: स्ट्रक्चर में आलसी प्रॉपर्टी म्यूटेशन समस्याएँ पैदा कर सकती हैं। यदि आलसी प्रॉपर्टी वाला स्ट्रक्चर let के रूप में घोषित किया गया है, तो प्रॉपर्टी तक पहुँच असंभव है क्योंकि इनिशियलाइज़ेशन के लिए स्ट्रक्चर के म्यूटेशन की आवश्यकता होती है।
चौथी: आलसी प्रॉपर्टी इनिशियलाइज़ेशन के दौरान willSet/didSet को ट्रिगर नहीं करती। केवल बाद के परिवर्तनों पर, यदि प्रॉपर्टी var के रूप में घोषित की गई है।
Stack Overflow (2025) के अनुसार, lazy के बारे में लगभग 15% प्रश्न let संदर्भ में lazy का उपयोग करने के प्रयास या एक बार के इनिशियलाइज़ेशन की गलतफहमी से संबंधित हैं। क्लास डिज़ाइन करते समय इन सीमाओं पर विचार करना महत्वपूर्ण है।
अक्सर पूछे जाने वाले प्रश्न
नहीं, lazy केवल var के लिए उपलब्ध है। let के साथ घोषित कॉन्स्टेंट को init पूरा होने से पहले इनिशियलाइज़ किया जाना चाहिए, जो विलंबित इनिशियलाइज़ेशन के साथ असंगत है।
ठीक एक बार। पहली एक्सेस पर, प्रॉपर्टी इनिशियलाइज़ होती है, जिसके बाद यह पुनर्गणना के बिना संग्रहीत मान लौटाती है।
इनिशियलाइज़ेशन थ्रेड-सुरक्षित है — दो थ्रेड प्रॉपर्टी को दो बार इनिशियलाइज़ नहीं करेंगे। हालाँकि, बाद के म्यूटेशन स्वचालित रूप से सिंक्रोनाइज़ नहीं होते।
नहीं, आलसी प्रॉपर्टी को ओवरराइड नहीं किया जा सकता। उपवर्ग केवल क्लोज़र के अंदर तर्क बदल सकता है, लेकिन आलसी इनिशियलाइज़ेशन को नहीं।
Lazy एक संग्रहीत प्रॉपर्टी है जो एक बार गणना की जाती है और मान संग्रहीत करती है। कंप्यूटेड प्रॉपर्टी हर एक्सेस पर गणना की जाती है और मान संग्रहीत नहीं करती।
सारांश
हम एक मोबाइल एप्लिकेशन टर्नकी विकसित करेंगे
IT Sectr 2017 से स्टार्टअप और व्यवसायों के लिए iOS और Android एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें