Struct या Class? Swift डेवलपर का शाश्वत प्रश्न
\n\nजो कोई भी Swift में लिखना शुरू करता है, उसे देर-सबेर इस प्रश्न का सामना करना पड़ता है। ऐसा लगता है कि दोनों ही संरचनाएं डेटा और विधियों के साथ ऑब्जेक्ट बनाने की अनुमति देती हैं। लेकिन Stack Overflow पर इस प्रश्न को हज़ारों बार क्यों देखा जाता है, और अनुभवी डेवलपर्स तेजी से संरचनाओं को क्यों पसंद कर रहे हैं?
\n\nइसका उत्तर सरल है: क्योंकि struct और class के बीच चुनाव सीधे आपके एप्लिकेशन के प्रदर्शन, थ्रेड सुरक्षा और आर्किटेक्चर को प्रभावित करता है। इस लेख में, हम केवल सिद्धांत नहीं, बल्कि वास्तविक उदाहरण और परिदृश्य देखेंगे जहां Struct निश्चित रूप से Class को हराता है।
\nयदि आप Swift में लिखते हैं और अभी भी Objective-C की "आदत" से क्लास का उपयोग कर रहे हैं — यह लेख आपके लिए है। अपने दृष्टिकोण पर पुनर्विचार करने के लिए तैयार हो जाइए।\n\n\n
मुख्य अंतर: Value Type बनाम Reference Type
\n\nविवरण में जाने से पहले, आइए मूलभूत अंतर को याद करें:
\n\n- \n
- Struct — एक value type (मान प्रकार) है। असाइन करने या फ़ंक्शन में पास करने पर डेटा की एक प्रतिलिपि बनाई जाती है। \n
- Class — एक reference type (संदर्भ प्रकार) है। असाइन करने या फ़ंक्शन में पास करने पर मेमोरी में उसी ऑब्जेक्ट का संदर्भ पास किया जाता है। \n
यह एक छोटी सी बात लगती है। लेकिन इस "परमाणु" अंतर से वे सभी परिणाम निकलते हैं जिन्हें हम अब समझेंगे।
\n\nउदाहरण 1: Class का अप्रत्याशित व्यवहार
\n\nclass PersonClass {\n var name: String\n init(name: String) {\n self.name = name\n }\n}\n\nstruct PersonStruct {\n var name: String\n}\n\n// क्लास का परीक्षण\nlet person1 = PersonClass(name: "अन्ना")\nlet person2 = person1\nperson2.name = "मारिया"\n\nprint(person1.name) // मारिया! person1 में भी बदल गया\nprint(person2.name) // मारिया\n\n\nसमस्या देखी? person2 का नाम बदलने पर, हमने अनजाने में person1 का भी नाम बदल दिया। आखिरकार, यह मेमोरी में एक ही ऑब्जेक्ट है। छोटे उदाहरण में यह गंभीर नहीं है, लेकिन वास्तविक प्रोजेक्ट में ऐसा "दुष्प्रभाव" मुश्किल से पकड़ में आने वाली बग का कारण बन सकता है।
// संरचना का परीक्षण\nvar person3 = PersonStruct(name: "अन्ना")\nvar person4 = person3\nperson4.name = "मारिया"\n\nprint(person3.name) // अन्ना! सब कुछ अपनी जगह पर है\nprint(person4.name) // मारिया\n\n\nसंरचना पूर्वानुमानित व्यवहार करती है: प्रत्येक वेरिएबल के पास डेटा की अपनी स्वतंत्र प्रतिलिपि होती है। यह सुरक्षित और पारदर्शी है।
\n\nStruct कब स्पष्ट विकल्प है?
\n\nApple अपने दस्तावेज़ में डिफ़ॉल्ट रूप से struct का उपयोग करने की सलाह देता है। आइए उन विशिष्ट परिदृश्यों को सूचीबद्ध करें जहां संरचना बिना किसी विकल्प के जीतती है।
\n\n1. डेटा जो अपरिवर्तनीय होना चाहिए
\n\nयदि आप उन मॉडलों के साथ काम कर रहे हैं जो निर्माण के बाद नहीं बदलने चाहिए (जैसे, सर्वर से क्वेरी परिणाम), तो स्थिर गुणों वाला struct एक आदर्श विकल्प है।
\n\nstruct UserProfile {\n let id: Int\n let name: String\n let email: String\n}\n\n// बनाया — और भूल गए। डेटा आकस्मिक परिवर्तनों से सुरक्षित है।\nlet profile = UserProfile(id: 1, name: "इवान", email: "ivan@example.com")\n\n\nक्लास के साथ, यदि गुण var के रूप में घोषित किया गया होता, तो आप गलती से name बदल सकते थे। संरचना के साथ, कंपाइलर आपको अपरिवर्तनीयता के बारे में सोचने के लिए मजबूर करेगा।
2. छोटी, आत्मनिर्भर संस्थाएं
\n\nयदि आपका मॉडल कुछ सरल वर्णन करता है — निर्देशांक, आकार, रंग, मुद्रा राशि — तो struct का उपयोग करें। यह तार्किक और कुशल है।
\n\nstruct Point {\n var x: Double\n var y: Double\n}\n\nstruct Money {\n var amount: Double\n var currency: String\n}\n\nstruct Rectangle {\n var origin: Point\n var size: Size\n}\n\n\nऐसे प्रकारों को वंशानुक्रम और संदर्भ प्रबंधन की आवश्यकता नहीं होती है। वे बस