सावधानी: आम आदमी की शर्तें आगे।
यह स्पष्टीकरण सबसे अधिक नटखट-किरकिरा कोड स्तर पर कठोरता से सही नहीं है। हालाँकि इसकी समीक्षा एक ऐसे व्यक्ति द्वारा की गई है जो वास्तव में स्विफ्ट पर काम करता है और उसने कहा कि यह एक बुनियादी स्पष्टीकरण के रूप में काफी अच्छा है।
इसलिए मैं "क्यों" के सवाल का सीधे और सीधे जवाब देने की कोशिश करना चाहता हूं ।
सटीक होने के लिए: हमें संरचनात्मक कार्यों को क्यों चिह्नित करना होगा, mutating
जब हम किसी भी संशोधित कीवर्ड के बिना संरचनात्मक मापदंडों को बदल सकते हैं?
तो, बड़ी तस्वीर, यह दर्शन के साथ बहुत कुछ करना है जो स्विफ्ट को तेज रखता है ।
आप इसे वास्तविक भौतिक पतों के प्रबंधन की समस्या की तरह सोच सकते हैं। जब आप अपना पता बदलते हैं, यदि आपके वर्तमान में बहुत सारे लोग हैं, तो आपको उन सभी को सूचित करना होगा जिन्हें आपने स्थानांतरित किया है। लेकिन अगर किसी के पास आपका वर्तमान पता नहीं है, तो आप जहां चाहें वहां जा सकते हैं, और किसी को भी जानने की जरूरत नहीं है।
इस स्थिति में, स्विफ्ट पोस्ट ऑफिस की तरह है। यदि बहुत सारे संपर्क वाले बहुत सारे लोग बहुत अधिक घूमते हैं, तो यह वास्तव में उच्च ओवरहेड है। उन सभी सूचनाओं को संभालने के लिए लोगों के एक बड़े स्टाफ को भुगतान करना पड़ता है, और इस प्रक्रिया में बहुत समय और प्रयास लगता है। यही कारण है कि स्विफ्ट का आदर्श राज्य अपने शहर में हर किसी के लिए यथासंभव संपर्क रखने के लिए है। फिर इसे पते में परिवर्तन से निपटने के लिए एक बड़े कर्मचारी की आवश्यकता नहीं है, और यह सब कुछ तेजी से और बेहतर तरीके से कर सकता है।
यह भी यही कारण है कि स्विफ्ट-लोग सभी मूल्य प्रकार बनाम संदर्भ प्रकारों के बारे में सोच रहे हैं। स्वभाव से, संदर्भ प्रकार सभी जगह "संपर्क" को रैक करते हैं, और मूल्य प्रकारों को आमतौर पर एक जोड़े से अधिक की आवश्यकता नहीं होती है। मूल्य प्रकार "स्विफ्ट" -एर हैं।
तो वापस छोटी तस्वीर के लिए structs
:। स्विफ्ट में संरचना एक बड़ी बात है क्योंकि वे ज्यादातर चीजें कर सकते हैं जो वस्तुएं कर सकती हैं, लेकिन वे मूल्य प्रकार हैं।
चलो एक कल्पना भौतिक पता सादृश्य जारी रखने के लिए misterStruct
है कि में रहती है someObjectVille
। सादृश्य यहाँ थोड़ा जीता है, लेकिन मुझे लगता है कि यह अभी भी उपयोगी है।
तो एक चर पर मॉडल को बदलने के लिए struct
, मान लें कि misterStruct
हरे बाल हैं, और नीले बालों पर स्विच करने का आदेश मिलता है। सादृश्य हो जाता है, जैसे मैंने कहा, लेकिन ऐसा होता है कि misterStruct
पुराने बालों को बदलने के बजाय , पुराने व्यक्ति बाहर निकल जाता है और नीले बालों वाला एक नया व्यक्ति अंदर चला जाता है, और वह नया व्यक्ति खुद को कॉल करना शुरू कर देता है misterStruct
। किसी को भी पते की अधिसूचना को बदलने की आवश्यकता नहीं है, लेकिन अगर कोई भी उस पते को देखता है, तो उन्हें नीले बालों वाला एक लड़का दिखाई देगा।
अब चलो जब आप किसी फ़ंक्शन को कॉल करते हैं तो मॉडल क्या होता है struct
। इस मामले में, यह ऐसा है जैसे misterStruct
एक आदेश मिलता है changeYourHairBlue()
। इसलिए डाकघर misterStruct
"आपके बालों को नीले रंग में बदलने के लिए निर्देश देता है और मुझे बताता है कि आप कब काम कर रहे हैं।"
यदि वह पहले जैसी ही दिनचर्या का पालन कर रहा है, यदि वह वही कर रहा है, जब चर को सीधे बदल दिया गया था, तो वह क्या misterStruct
करेगा अपने घर से बाहर निकलकर एक नए व्यक्ति को नीले बालों के साथ बुलाएगा। लेकिन यही समस्या है।
आदेश था "अपने बालों को नीले रंग में बदलो और मुझे बताएं कि आप कब हो चुके हैं," लेकिन यह हरे रंग का लड़का है जिसे यह आदेश मिला है। नीले आदमी के चले जाने के बाद, एक "नौकरी पूर्ण" अधिसूचना को अभी भी वापस भेजा जाना है। लेकिन नीला आदमी इसके बारे में कुछ नहीं जानता है।
[वास्तव में इस साज़िश को कुछ भयावह रूप से जीतने के लिए, जो तकनीकी रूप से हरे-बालों वाले आदमी के साथ हुआ था, वह यह था कि बाहर जाने के बाद उसने तुरंत आत्महत्या कर ली थी। इसलिए वह किसी को भी सूचित नहीं कर सकता है कि कार्य पूरा हो गया है! ]
इस समस्या से बचने के लिए, केवल इस तरह के मामलों में , स्विफ्ट को उस पते पर सीधे घर जाना होगा और वास्तव में वर्तमान निवासी के बालों को बदलना होगा । यह एक नए आदमी में भेजने की तुलना में एक पूरी तरह से अलग प्रक्रिया है।
और यही कारण है कि स्विफ्ट हमें mutating
कीवर्ड का उपयोग करना चाहता है !
अंतिम परिणाम किसी भी चीज के समान दिखता है जिसे संरचना को संदर्भित करना है: घर के निवासी के पास अब नीले बाल हैं। लेकिन इसे प्राप्त करने की प्रक्रियाएं वास्तव में पूरी तरह से अलग हैं। ऐसा लग रहा है कि यह एक ही काम कर रहा है, लेकिन यह बहुत अलग काम कर रहा है। यह एक ऐसी चीज है जो स्विफ्ट संरचना को सामान्य रूप से कभी नहीं करता है।
तो गरीब कंपाइलर को थोड़ी मदद करने के लिए, न कि यह पता लगाने के लिए कि क्या कोई फ़ंक्शन struct
अपने स्वयं के हर एक संरचनात्मक फ़ंक्शन के लिए, कभी-कभी म्यूट करता है या नहीं , हमें दया आती है और mutating
कीवर्ड का उपयोग करने के लिए कहा जाता है ।
संक्षेप में, स्विफ्ट को तेज रहने में मदद करने के लिए, हम सभी को अपना हिस्सा करना चाहिए। :)
संपादित करें:
अरे यार / दुस्साहस जिसने मुझे नीचा दिखाया, मैंने अपना जवाब पूरी तरह से लिख दिया। यदि यह आपके साथ बेहतर बैठता है, तो क्या आप डाउनवोट को हटा देंगे?