Computer >> कंप्यूटर >  >> स्मार्टफोन्स >> iPhone

एक मां और दो बेटों की कहानी:स्विफ्ट में वैल्यू टाइप बनाम रेफरेंस टाइप

स्विफ्ट एक माँ है? और उसके दो बेटे हैं?-

  • मान प्रकार ??♀️
  • संदर्भ प्रकार ?‍♂️

लेकिन उनकी विशेषताएं क्या हैं??♂️

क्या वे एक दूसरे के समान या विपरीत व्यवहार करते हैं? ?‍♂️

स्विफ्ट एक बहु-प्रतिमान प्रोग्रामिंग भाषा है जिसे Apple द्वारा iOS, macOS, watchOS, tvOS, Linux और z/OS के लिए विकसित किया गया है।?

अन्य ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग भाषाओं की तरह, स्विफ्ट में बिल्डिंग ब्लॉक्स के रूप में कक्षाएं हैं जो विधियों, गुणों, प्रारंभकर्ताओं को परिभाषित कर सकती हैं, और प्रोटोकॉल के अनुरूप हो सकती हैं, विरासत और बहुरूपता का समर्थन कर सकती हैं।?

लेकिन, रुकिए रुकिए रुकिए…???

स्विफ्ट में स्ट्रक्चर भी होते हैं और यह विधियों, गुणों, इनिशियलाइज़र को परिभाषित कर सकता है और इनहेरिटेंस के केवल एक अपवाद के साथ प्रोटोकॉल के अनुरूप हो सकता है।?

क्या? अब मैं भ्रमित हूँ !!! ???

अब आपके भ्रम को तेज करते हैं:स्विफ्ट में संरचनाएं केवल मूल्य प्रकार नहीं हैं। टुपल्स और एनम भी मूल्य प्रकार हैं। संदर्भ प्रकार के रूप में उपयोग की जाने वाली कक्षाएं भी एकमात्र नहीं हैं। फ़ंक्शंस और क्लोजर भी संदर्भ प्रकार हैं। लेकिन राहत के प्रतीक के रूप में, हम कम से कम इन प्रकारों के उपयोग के प्राथमिक फोकस और विशेषज्ञता को जानते हैं।?

तो इस बिंदु तक, हम केवल एक बड़े भ्रम के साथ structs और कक्षाओं के उपयोग के साथ रह गए हैं।?

तो चलिए चलते हैं और चारों ओर चल रहे भ्रम को दूर करते हैं।?♂️

संग्रहण स्थान

तीन प्रकार के संग्रहण उपलब्ध हैं:

  • पंजीकरण करें?
  • स्टैक ☄️
  • ढेर?

जिन वस्तुओं का जीवनकाल छोटा होता है, उन्हें रजिस्टरों या स्टैक के अंदर संग्रहीत किया जाता है और जिनकी आयु लंबी होती है उन्हें हीप के अंदर संग्रहीत किया जाता है।?

एक मान प्रकार अपनी सामग्री को स्टैक में आवंटित मेमोरी में संग्रहीत करता है, इसलिए हम कह सकते हैं कि स्विफ्ट में स्टैक में मान प्रकार आवंटित किए जाते हैं। ?

लेकिन मूल्य प्रकारों के बारे में एक आम गलत धारणा है, क्या आपने इसे सुना है??♂️

गलत धारणा यह है कि ज्यादातर लोग सोचते हैं कि मूल्य प्रकार हमेशा स्टैक में संग्रहीत होते हैं।

एक मिनट रुकिए — ऐसा हमेशा नहीं होता है।

जब वे अस्थायी या स्थानीय चर होते हैं तो मूल्य प्रकारों को स्टैक के अंदर संग्रहीत किया जा सकता है। लेकिन क्या होगा यदि कोई मान प्रकार किसी संदर्भ प्रकार के अंदर समाहित हो?

इस स्थिति में, इसे हीप मेमोरी के अंदर संग्रहीत किया जा सकता है। ?

वाह...बहुत बढ़िया!!!?

तो मूल्य प्रकारों को उनके जीवनकाल के आधार पर रजिस्टर, स्टैक या ढेर के अंदर संग्रहीत किया जा सकता है, चाहे वे अल्पकालिक हों या लंबे समय तक। यदि यह एक स्थानीय चर है तो यह ढेर के अंदर रह सकता है और यदि यह कक्षा का हिस्सा है तो यह ढेर स्मृति के अंदर भी रह सकता है।✅

दूसरी ओर, संदर्भ प्रकार अपनी सामग्री को हीप मेमोरी में आवंटित मेमोरी में संग्रहीत करता है और चर केवल उस मेमोरी स्थान का संदर्भ रखता है जहां वास्तविक डेटा संग्रहीत किया गया है। ??

यह संदर्भ प्रकार के लिए कैसे काम करता है ??

तो संदर्भ प्रकार के लिए, यह काफी सामान्य स्थिति है जब एक ही स्मृति स्थान के संदर्भ में कई चर हो सकते हैं।⚔️

जब एक वैल्यू टाइप इंस्टेंस को किसी वेरिएबल को असाइन किया जाता है या किसी फंक्शन को पास किया जाता है, तो इंस्टेंस को कॉपी करके उस वेरिएबल को असाइन किया जाता है। लेकिन संदर्भ प्रकार के साथ, केवल संदर्भ की प्रतिलिपि बनाई जाती है और नया चर उसी स्मृति स्थान के समान संदर्भ रखता है। ?

म्यूटेबिलिटी के मामले में अंतर

एक चर के लिए दो अवस्थाएँ हो सकती हैं:

  • ?‍♀ ️म्यूटेबल ?‍♀
  • ?️‍♂️ अपरिवर्तनीय ?️‍♂️

यदि एक मूल्य प्रकार का उदाहरण एक अपरिवर्तनीय चर को सौंपा गया है, तो उदाहरण भी अपरिवर्तनीय हो जाता है। परिणामस्वरूप, हम उस इंस्टेंस में कोई बदलाव नहीं कर सकते हैं।?♂️

यदि एक मूल्य प्रकार का उदाहरण एक परिवर्तनशील चर को सौंपा गया है, तो केवल यह उदाहरण को परिवर्तनशील बनाता है। ?‍♂️

लेकिन संदर्भ प्रकारों के लिए चीजें बिल्कुल अलग हैं। वेरिएबल और जिस इंस्टेंस को इसे सौंपा गया है वह पूरी तरह से अलग है। यदि हम किसी वर्ग के संदर्भ में एक अपरिवर्तनीय चर घोषित करते हैं, तो इसका मतलब है कि वह जो संदर्भ धारण कर रहा है वह कभी नहीं बदलेगा। हम संदर्भ को बदल नहीं सकते हैं और यह हमेशा एक ही संदर्भ को इंगित करेगा। ?

संरचनात्मक प्रकार

संरचनात्मक प्रकारों के मूल्यों की तुलना उनके गुणों या तत्वों के संदर्भ में समानता के लिए की जाती है। हम कह सकते हैं कि एक मान प्रकार दूसरे के बराबर है यदि और केवल तभी जब सभी संबंधित विशेषताएँ समान हों। ???

उम्म…बहुत सारे कड़े शब्द…आपका क्या मतलब है???

मान लें, हमारे पास एक व्यक्ति . है मान प्रकार जिसमें प्रथमनाम . जैसी विशेषताएं हैं और अंतिम नाम.

struct Person {
   var firstName: String
   var lastName: String
}

var person1 = Person(firstName: "foo", lastName: "bar")

var person2 = Person(firstName: "foo", lastName: "bar")

यहां दोनों person1 &व्यक्ति2 उदाहरण प्रथम नाम . के लिए समान मान रखते हैं ("फू") और अंतिम नाम ("बार") . इसलिए हमारी समझ के अनुसार, हम कह सकते हैं कि दोनों उदाहरण एक दूसरे के बराबर हैं क्योंकि उनके गुण (firstName &अंतिम नाम ) समान मान धारण कर रहे हैं।

लेकिन यह केवल यहीं तक सीमित नहीं है:भविष्य में, firstName के लिए समान मान रखने वाले किन्हीं दो व्यक्तियों के उदाहरण &अंतिम नाम एक दूसरे के बराबर होंगे।

तो अब तक अपनी समझ के अनुसार हम कह सकते हैं कि:

मान प्रकारों की कोई पहचान नहीं होती, इसलिए उनका कोई संदर्भ नहीं हो सकता। मूल्य प्रकार फेसलेस होते हैं।?

क्या? आप ऐसा कैसे कह सकते हैं????

var myAge: Int = 21
var friendAge: Int = 21

दोनों myAge &दोस्त आयु मान 21 के साथ पूर्णांक प्रकार चर हैं।

क्या हम एक को दूसरे से अलग कर सकते हैं? ?

नहीं, क्योंकि उनका मूल्य समान है।?

21 के मान वाला एक पूर्णांक चर दूसरे पूर्णांक चर से भिन्न नहीं हो सकता है, जिसका मान भी 21 है। जितना आसान है।???

पहचान न होने से मूल्य प्रकारों को एक और फायदा मिलता है:यदि आप व्यावहारिक रूप से सोचते हैं, तो आप कल्पना कर सकते हैं कि यदि आपके पास कोई पहचान नहीं है तो समान विशेषताओं वाला कोई भी व्यक्ति आपको प्रतिस्थापित या प्रतिस्थापित कर सकता है। ???

वही हम अपने लिए इंसानों के रूप में भी सोच सकते हैं। अगर मेरी कोई पहचान नहीं है तो समान विशेषताओं वाला कोई भी व्यक्ति मेरी जगह ले सकता है ??? यह हमारे लिए अच्छा है कि हमारी एक पहचान है अन्यथा यह हमारे अस्तित्व के लिए एक बड़ा जोखिम होगा।?

लेकिन मूल्य प्रकारों के लिए, उनकी कोई पहचान नहीं होती है और यह उनके लिए एक फायदा है। ?

मान प्रकार का उपयोग करने के क्या लाभ हैं?

? कोई दौड़ की स्थिति और गतिरोध नहीं:?

बहु-थ्रेडेड वातावरण में मान प्रकारों के लिए, एक थ्रेड के लिए उदाहरण की स्थिति को बदलना असंभव है, जबकि इसका उपयोग किसी अन्य थ्रेड द्वारा किया जा रहा है। तो हम कह सकते हैं कि कोई दौड़ की स्थिति या गतिरोध नहीं होगा।

⚔️ कोई रिटेन साइकिल नहीं:⚔️

जब दो संदर्भ प्रकार के उदाहरण होते हैं जो एक-दूसरे के लिए मजबूत संदर्भ रखते हैं और एक-दूसरे को स्मृति से हटाए जाने से रोकते हैं, इसे एक बनाए रखने का चक्र कहा जाता है। चूंकि मान प्रकार एक संदर्भ के रूप में काम नहीं करते हैं, इसलिए हम कह सकते हैं कि मूल्य प्रकारों के लिए कोई रिटेन चक्र नहीं होगा।

?‍?‍?‍? स्वचालित संदर्भ गणना:?‍?‍?‍?

संदर्भ प्रकार के लिए, स्विफ्ट सभी जीवित या सक्रिय वस्तुओं का ट्रैक रखने के लिए स्वचालित संदर्भ गणना का उपयोग करता है और उदाहरण को तभी हटाता है जब इसके लिए कोई और मजबूत संदर्भ नहीं होता है। अगर हम थोड़ा सोचते हैं, तो हम कह सकते हैं कि यह एक भारी ऑपरेशन है क्योंकि स्विफ्ट रनटाइम को हमेशा वस्तुओं पर नज़र रखने की आवश्यकता होती है। लेकिन चूंकि स्टैक में मूल्य प्रकार आवंटित किए जाते हैं, इसलिए इसे एआरसी की आवश्यकता नहीं होती है। तो यह सस्ता और तेज़ है ??.

लेकिन रुकिए... यह ऐरे, डिक्शनरी और स्ट्रिंग के लिए मेमोरी को कैसे मैनेज करता है??

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

लेकिन यह क्या है??

जब हम कहते हैं कि एक उदाहरण दूसरे उदाहरण की एक प्रति है, तो इसका वास्तव में अर्थ है कि वे समान हैं, कि उनमें समान मान हैं। लेकिन स्विफ्ट में, इन उपरोक्त प्रकारों (ऐरे, डिक्शनरी, स्ट्रिंग, आदि) के लिए, एक वास्तविक प्रतिलिपि केवल एक उदाहरण के उत्परिवर्तित होने पर हीप पर बनाई गई है। इसे मान प्रकारों के लिए प्रदर्शन अनुकूलन तकनीक कहा जाता है।???

निष्कर्ष

कोई कठोर नियम नहीं है जो परिभाषित करता है कि कब मूल्य प्रकार का उपयोग करना है और कब संदर्भ प्रकार का उपयोग करना है। संदर्भ प्रकारों की तुलना में मूल्य प्रकारों के कुछ अनूठे फायदे हैं और इसके विपरीत। वे दोनों अपने तरीके से अद्वितीय हैं। यह वास्तव में आपकी आवश्यकताओं और आप जो हासिल करने की कोशिश कर रहे हैं उस पर निर्भर करता है। आपको अपने कोड के शब्दार्थ को जानना चाहिए क्योंकि आप केवल अपना कोड सबसे अच्छी तरह से जानते हैं, इसलिए यह आपको चुनना है। आपको पूरी आजादी है।

इसलिए वैल्यू टाइप बनाम रेफरेंस टाइप पर लड़ने के बजाय, समझदारी से उनका इस्तेमाल करें।

??? प्रोत्साहित करना!!! पढ़ने के लिए धन्यवाद!! ???

✅✅✅आप मुझे यहां ढूंढ सकते हैं ट्विटर .✅✅✅


  1. सी # में मूल्य प्रकारों और संदर्भ प्रकारों को समझाएं और इसके विपरीत करें

    सामान्य तौर पर, C# के सभी प्रकारों को दो मुख्य श्रेणियों में विभाजित किया जा सकता है - मान प्रकार और संदर्भ प्रकार . आइए प्रत्येक प्रकार को विस्तार से देखें। मान प्रकार मूल्य प्रकारों के वेरिएबल में सीधे उनका डेटा होता है। प्रत्येक चर के पास डेटा की अपनी प्रति होती है। इसलिए मान प्रकार के एक चर के

  1. पायथन में एक शब्दकोश में एक कुंजी के मूल्य को कैसे अपडेट करें?

    पायथन डिक्शनरी ऑब्जेक्ट key:value जोड़े का एक अनियंत्रित संग्रह है। इना डिक्शनरी ऑब्जेक्ट डी, किसी भी कुंजी से जुड़ा मूल्य डी [के] द्वारा प्राप्त किया जा सकता है। >>> d={'one':1, 'two':2,'three':3,'four':4} >>> d['two'] 2 असाइनमेंट d[k]=v डि

  1. आइए स्विफ्ट में जेनरिक और किसी भी प्रकार के बीच के अंतरों को देखें

    स्विफ्ट आजकल शीर्षतम प्रकार की सुरक्षित भाषाओं में से एक है। ??? ओह रुको !! यदि कोई भाषा टाइप-सुरक्षित है तो इसका क्या अर्थ है? ? टाइप-सुरक्षित भाषा हमेशा यह सुनिश्चित करती है कि ऑपरेशन उस बिंदु पर उपलब्ध सही प्रकार के डेटा के साथ काम करे।✓ यदि किसी भाषा में विभिन्न डेटा प्रकारों (जैसे, Int, Flo