Swift में Static बनाम Class: अपने कोड के लिए क्या चुनें?

शुरुआती लोगों के लिए ऑनलाइन Python प्रशिक्षक

Python आसानी से सीखें बिना सिद्धांत के बोझ के। स्वचालित जांच के साथ व्यावहारिक कार्य हल करें और ब्राउज़र में सीधे कोड लिखें।

पाठ्यक्रम शुरू करें

परिचय: Swift में static और class की शाश्वत बहस

\n

यदि आपने कभी Swift में कोड लिखा है, तो आप निश्चित रूप से ऐसी स्थिति में आए होंगे: एक ऐसा मेथड या वेरिएबल बनाना है जो टाइप से ही संबंधित हो, न कि उसके इंस्टेंस से। और यहाँ एक दुविधा पैदा होती है — कीवर्ड static का उपयोग करें या class का? Stack Overflow पर इस प्रश्न ने हजारों व्यूज एकत्र किए हैं, और यह सही भी है: अंतर सूक्ष्म है, लेकिन एप्लिकेशन आर्किटेक्चर के सही डिज़ाइन के लिए यह महत्वपूर्ण है।

\n

इस ट्यूटोरियल में हम एक बार और हमेशा के लिए समझेंगे कि Swift में static और class में क्या अंतर है, कब क्या उपयोग करना है, और इनहेरिटेंस के दौरान कैसे गलती से बचना है। चलिए शुरू करते हैं!

\n\n

टाइप प्रॉपर्टी और मेथड्स क्या हैं?

\n

गहराई में जाने से पहले, आइए मूल बातें याद करें। Swift में, प्रत्येक क्लास, स्ट्रक्चर या एनम के दो प्रकार के सदस्य होते हैं:

\n
    \n
  • इंस्टेंस (Instance) — किसी विशिष्ट ऑब्जेक्ट से संबंधित होते हैं। इनका उपयोग करने के लिए, एक इंस्टेंस बनाना होता है: let obj = MyClass()।
  • \n
  • टाइप (Type) — स्वयं टाइप से संबंधित होते हैं। इन्हें टाइप के नाम से कॉल किया जाता है: MyClass.someMethod()।
  • \n
\n

Swift में टाइप प्रॉपर्टी और मेथड्स बनाने के लिए कीवर्ड static और class का उपयोग किया जाता है। और यहीं से सबसे दिलचस्प बात शुरू होती है।

\n\n

Static: सख्त और अपरिवर्तनीय

\n

कीवर्ड static आपका विश्वसनीय मित्र है जब आप एक ऐसी प्रॉपर्टी या मेथड बनाना चाहते हैं जिसे सबक्लास में ओवरराइड नहीं किया जा सकता। यह क्लास, स्ट्रक्चर और एनम सभी के लिए समान रूप से काम करता है।

\n

आइए एक उदाहरण देखें। मान लीजिए हम छात्रों के रिकॉर्ड के लिए एक एप्लिकेशन बना रहे हैं और बनाए गए ऑब्जेक्ट्स की कुल संख्या संग्रहीत करना चाहते हैं:

\n\n
class Student {\n    static var totalCount = 0\n    \n    let name: String\n    \n    init(name: String) {\n        self.name = name\n        Student.totalCount += 1\n    }\n    \n    static func printTotal() {\n        print("कुल छात्र: \\(totalCount)")\n    }\n}\n\nlet s1 = Student(name: "इवान")\nlet s2 = Student(name: "मारिया")\nStudent.printTotal() // आउटपुट: कुल छात्र: 2
\n\n

ध्यान दें: हम totalCount और printTotal() को क्लास के नाम Student के माध्यम से एक्सेस कर रहे हैं, न कि इंस्टेंस के माध्यम से। यह काउंटर, डिफ़ॉल्ट कॉन्फ़िगरेशन या डेटा कैशिंग के लिए सुविधाजनक है।

\n\n

स्ट्रक्चर और एनम में Static

\n

स्ट्रक्चर और एनम में, static टाइप सदस्यों को घोषित करने का एकमात्र तरीका है। उदाहरण के लिए:

\n\n
enum HTTPMethod {\n    case get\n    case post\n    case put\n    \n    static let defaultMethod: HTTPMethod = .get\n}\n\nstruct AppConfig {\n    static let apiURL = "https://api.example.com"\n    static let timeout: Double = 30.0\n}
\n\n

यहाँ static पूरी तरह से काम करता है, क्योंकि स्ट्रक्चर और एनम इनहेरिटेंस का समर्थन नहीं करते, और इसलिए ओवरराइडिंग की आवश्यकता नहीं है।

\n\n

Class: इनहेरिटेंस का लचीलापन

\n

जबकि कीवर्ड class उन लोगों के लिए एक उपकरण है जो क्लासेस (और केवल उनके साथ) काम करते हैं और सबक्लासेस को मेथड्स या प्रॉपर्टीज को ओवरराइड करने की अनुमति देना चाहते हैं। class का उपयोग स्ट्रक्चर या एनम में नहीं किया जा सकता।

\n

मान लीजिए हमारे पास एक बेस क्लास Vehicle है और हम चाहते हैं कि प्रत्येक सबक्लास अपना विवरण प्रदान कर सके:

\n\n
class Vehicle {\n    class func description() -> String {\n        return "यह एक वाहन है"\n    }\n}\n\nclass Car: Vehicle {\n    override class func description() -> String {\n        return "यह एक कार है"\n    }\n}\n\nclass Bicycle: Vehicle {\n    override class func description() -> String {\n        return "यह एक साइकिल है"\n    }\n}\n\nprint(Vehicle.description()) // यह एक वाहन है\nprint(Car.description())     // यह एक कार है\nprint(Bicycle.description()) // यह एक साइकिल है

ब्लॉग

पुस्तक अनुशंसाएँ