Swift आजकल शीर्ष टाइप-सेफ भाषाओं में से एक है। ???
ओह रुको!! इसका क्या मतलब है अगर एक भाषा टाइप-सेफ है? ?
एक टाइप-सेफ भाषा हमेशा यह सुनिश्चित करती है कि एक ऑपरेशन उस बिंदु पर उपलब्ध सही प्रकार के डेटा के साथ काम करता है।✓
यदि किसी भाषा में विभिन्न डेटा प्रकारों (जैसे, Int, Float, String, Array, Dictionary) की घोषणा करने की क्षमता है और इसमें यह सुनिश्चित करने की क्षमता भी है कि एक विशेष डेटा प्रकार के साथ घोषित एक चर कभी भी एक अलग प्रकार का डेटा नहीं रखेगा, तो इसे टाइप-सेफ भाषा कहा जाता है।
टाइप-सेफ भाषाओं में, टाइप चेकिंग हमेशा की जाती है। यह भाषा के आधार पर कंपाइल टाइम या रन टाइम पर हो सकता है।✅
अब, Swift में Generics क्या हैं??
Generics टाइप-सेफ हैं, और हमें लचीले, पुन: प्रयोज्य फ़ंक्शन और प्रकार लिखने में मदद करते हैं। Generics का उपयोग करके, हम कोड लिख सकते हैं जो सभी डेटा प्रकारों के लिए काम करता है। चूंकि Swift एक टाइप-सेफ भाषा है, इसे तोड़े बिना हम जेनेरिक कोड लिख सकते हैं जो कोड डुप्लिकेशन से बचाता है।
आइए एक सरल उदाहरण लें: एक Array एक क्रमबद्ध संग्रह है जो उसी प्रकार के डेटा को रख सकता है। इसलिए Array की परिभाषा में, हम देख सकते हैं कि यह Element. का एक जेनेरिक प्रकार लेता है। इसलिए एक Array एक Collection का जेनेरिक प्रकार बन जाता है।
ठीक है। कूल। तो Swift में Any टाइप क्या है????
Swift Any टाइप का भी समर्थन करता है। जैसा कि नाम से संकेत मिलता है, यह स्ट्रक्चर, क्लास, एनम और फ़ंक्शन टाइप जैसे किसी भी प्रकार के इंस्टेंस को प्रतिनिधित्व कर सकता है।
तो क्या Objective C id और Swift का Any समान हैं??
Swift 3 में, Objective C id टाइप Swift के Any टाइप पर मैप होता है। यह Swift और Objective C की अनुकूलता में सुधार करता है।
लेकिन कैसे और क्यों??
Swift 2 में, Objective C id को Swift के Any ऑब्जेक्ट पर मैप किया गया था। यह ज्यादातर मामलों के लिए अच्छा काम करता था, लेकिन कभी-कभी इसके परिणामस्वरूप अप्रत्याशित व्यवहार होता था। Swift में प्रमुख अवधारणाओं में से एक वैल्यू टाइप्स है, और यह मैपिंग इस अवधारणा के साथ उचित न्याय नहीं कर रहा था।
Swift iOS डेवलपमेंट के लिए सिर्फ एक नई भाषा है, और Objective C वर्षों से आसपास है। इसलिए निश्चित रूप से अधिकांश प्रोजेक्ट्स केवल Objective C में विकसित किए गए थे। अब एक Objective C प्रोजेक्ट को Swift प्रोजेक्ट में बदलने के लिए, आवश्यकता आई कि किसी भी Swift टाइप को किसी भी Objective C ऑब्जेक्ट से ब्रिज करना संभव होना चाहिए।
लेकिन यह Swift क्लासेस और Swift वैल्यू टाइप्स जैसे Int, String, Float के लिए कोई समस्या नहीं थी क्योंकि उनके पास पहले से ही उनके Objective C समकक्ष हैं। समस्या उन Swift वैल्यू टाइप्स के लिए उत्पन्न हुई जिनके कोई Objective C समकक्ष नहीं थे।
इसे ठीक करने के लिए, Objective C id टाइप Swift Any टाइप पर मैप किया गया।✅✅✅
पर्याप्त परिभाषाएं ?. अब मुख्य विषय पर आते हैं। उपरोक्त बिंदुओं से, ऐसा लगता है कि Generics और Any टाइप समान हैं। लेकिन क्या वे वास्तव में???
उच्च स्तर पर, Any Generics के समान दिख सकता है। लेकिन आइए कुछ अंतर खोजने की कोशिश करते हैं-???
हम सभी जानते हैं कि डेटा स्ट्रक्चर में Stack क्या है, है ना? एक स्टैक एक बुनियादी रैखिक डेटा संरचना है जहां आइटम का सम्मिलन और विलोपन केवल एक छोर पर होता है।
अब हम Swift में Stack संरचना को लागू करेंगे। पहले, हम Generics का उपयोग करके कार्यान्वित करेंगे फिर Any टाइप के साथ।
Generics का उपयोग करके Stack कार्यान्वयन:
उपरोक्त Stack कार्यान्वयन Generics का उपयोग कर रहा है। स्ट्रक्चर Element आइटम का एक जेनेरिक प्रकार लेता है और उस आइटम का उपयोग करके एक स्टैक लागू करता है। अब आइए जेनेरिक स्टैक के साथ कुछ ऑपरेशन करें:
यह एक जेनेरिक स्टैक घोषित करता है जो Integer प्रकार के एलिमेंट को रख सकता है। हम स्टैक में पूर्णांक एलिमेंट को पुश कर रहे हैं। इस बिंदु तक, सब कुछ बढ़िया काम करता है।
लेकिन क्या होगा अगर मैं उस जेनेरिक स्टैक के ऊपर एक फ्लोट एलिमेंट पुश करना चाहता हूं?
❌❌ ऊप्स! कंपाइलेशन त्रुटि! ❌❌
Any टाइप का उपयोग करके Stack कार्यान्वयन:
इस Stack कार्यान्वयन में, आइटम ऐरे Any प्रकार के एलिमेंट को रख सकता है। हम परिभाषा में आइटम ऐरे एलिमेंट के सटीक डेटा प्रकार के बारे में निर्दिष्ट नहीं कर रहे हैं। अब आइए इस स्टैक पर वही बुनियादी ऑपरेशन करें:
कोई समस्या नहीं, है ना? यहां भी सब कुछ ठीक काम कर रहा है। प्रारंभ में, हमने एक स्टैक घोषित किया और इसमें दो पूर्णांक एलिमेंट पुश किए। जब हम show() मेथड को कॉल करते हैं, तो यह सटीक ऐरे [3, 4]. प्रिंट करता है।
अब इसमें एक फ्लोट वैल्यू पुश करते हैं।☄️
✅✅ कोई त्रुटि नहीं! सब कुछ ठीक काम करता है! ✅✅
तो पर्दे के पीछे क्या हो रहा है? हमें कोई त्रुटि क्यों नहीं मिल रही????
Generics मूल रूप से कंपाइलर को बताता है कि:
मैंने एक जेनेरिक प्रकार घोषित किया है और मैं आपको बाद में एक सटीक प्रकार दूंगा। मैं चाहता हूं कि आप उस प्रकार को हर जगह लागू करें जहां मैं निर्दिष्ट करता हूं।
Any टाइप मूल रूप से कंपाइलर को बताता है:
इस चर के बारे में चिंता न करें, यहां किसी प्रकार को लागू करने की आवश्यकता नहीं है मुझे जो करना है करने दें।
Generics का उपयोग लचीले फ़ंक्शन को परिभाषित करने के लिए किया जा सकता है, लेकिन तर्कों के प्रकार अभी भी कंपाइलर द्वारा जांचे जाते हैं। Any टाइप का उपयोग Swift की टाइप सिस्टम को चकमा देने के लिए किया जा सकता है।?
जेनेरिक स्टैक घोषणा में, हम कंपाइलर को बता रहे हैं कि स्टैक को केवल पूर्णांक प्रकार लेना चाहिए। फिर जब हम इसमें फ्लोट प्रकार का एलिमेंट डालने की कोशिश कर रहे हैं, तो इसका मतलब है कि हम उस वादे को तोड़ रहे हैं। इसलिए यह कंपाइल टाइम त्रुटि फेंक रहा है। यह हमेशा उम्मीद करता है कि एलिमेंट पूर्णांक प्रकार का होना चाहिए।
लेकिन Any स्टैक के लिए, हमें कोई कंपाइल टाइम या रनटाइम त्रुटि नहीं मिल रही है। यहां तक कि अगर हम show() मेथड को कॉल करते हैं, तो यह स्टैक को [3, 4, 5.0] के रूप में प्रिंट करता है जिसका मतलब है कि स्टैक पूर्णांक और फ्लोट प्रकार के मान रखता है। तो किसी भी स्टैक में कोई प्रकार प्रतिबंध नहीं है, हम इसमें किसी भी प्रकार का मान डाल सकते हैं (लेकिन रनटाइम अपवादों की संभावनाएं हैं)।
निष्कर्ष
तो अगर हम Generics का उपयोग करते हैं तो हम Swift की टाइप सेफ्टी से समझौता किए बिना लचीले फ़ंक्शन, संरचनाएं, क्लासेस, और प्रोटोकॉल लिख सकते हैं। लेकिन अगर हम Any टाइप का उपयोग करते हैं, तो हम अपने खुद के बॉस की तरह हैं, हम लगभग कुछ भी कर सकते हैं जो हम चाहते हैं।
??? चीयर्स!!! पढ़ने के लिए धन्यवाद!! ???