Swift में रिफ्लेक्शन और इंट्रोस्पेक्शन: कोड की आत्मा में झाँकना

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

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

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

Swift में रिफ्लेक्शन और इंट्रोस्पेक्शन: कोड की आत्मा में झाँकना

\n\n

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

\n\n

आज हम सिर्फ थ्योरी नहीं पढ़ेंगे। हम ऐसा कोड लिखेंगे जो खुद की जाँच करता है, डायनामिक रूप से प्रोटोकॉल चेक करना सीखेंगे, और Codable के बिना भी ऑब्जेक्ट्स को सीरियलाइज़ करेंगे। चलिए शुरू करते हैं!

\n\n

रिफ्लेक्शन और इंट्रोस्पेक्शन क्या हैं? इन अवधारणाओं को भूलकर न समझें

\n\n

आइए स्पष्ट शब्दावली से शुरू करें, ताकि Swift runtime की गहराइयों में खो न जाएँ।

\n\n
    \n
  • इंट्रोस्पेक्शन — यह प्रोग्राम की रनटाइम पर "खुद को देखने" की क्षमता है: किसी ऑब्जेक्ट का टाइप, प्रॉपर्टीज़ की संख्या, मेथड के नाम पता करना। Swift में यह Mirror प्रोटोकॉल और is, as?, type(of:) ऑपरेटरों के माध्यम से लागू किया गया है।
  • \n
  • रिफ्लेक्शन — यह एक व्यापक अवधारणा है। यह सिर्फ देखना नहीं है, बल्कि प्रोग्राम की संरचना को तुरंत प्रभावित करने की क्षमता भी है: नाम से मेथड कॉल करना, प्रॉपर्टीज़ बदलना, नए टाइप बनाना। Swift में रिफ्लेक्शन सीमित है (Python या Ruby के विपरीत), लेकिन इसकी क्षमताएँ प्रभावशाली हैं।
  • \n
\n\n

मुख्य अंतर: इंट्रोस्पेक्शन पढ़ना है, रिफ्लेक्शन पढ़ना + लिखना है। Swift एक सुरक्षित भाषा के रूप में स्थापित है, इसलिए शुद्ध Swift टाइप्स के लिए पूर्ण रिफ्लेक्शन (जैसे Objective-C में) उपलब्ध नहीं है। लेकिन NSObject से विरासत में मिली क्लासेस के लिए, अधिक संभावनाएँ खुलती हैं।

\n\n

Swift में इंट्रोस्पेक्शन के उपकरण: सरल से जटिल तक

\n\n

1. is और as? ऑपरेटर — क्लासिक तरीका

\n\n

किसी ऑब्जेक्ट का टाइप जानने का सबसे सरल तरीका is के माध्यम से जाँच करना है:

\n\n
let value: Any = "Hello, Swift!"\n\nif value is String {\n    print("यह एक स्ट्रिंग है!")\n}\n\nif let number = value as? Int {\n    print("यह एक संख्या है: \\(number)")\n} else {\n    print("यह संख्या नहीं है")\n}
\n\n

यहाँ हम टाइप जाँच के लिए is और सुरक्षित कास्टिंग के लिए as? का उपयोग कर रहे हैं। Swift में किसी भी इंट्रोस्पेक्शन का यह आधार है — आप लगातार ऑब्जेक्ट से पूछ रहे हैं: "तुम कौन हो?"।

\n\n

2. type(of:) — डायनामिक रूप से टाइप पता करें

\n\n

type(of:) फंक्शन दिए गए वैल्यू का मेटाटाइप (Any.Type) लौटाता है। यह तब उपयोगी होता है जब आपको सटीक डायनामिक टाइप चाहिए, न कि घोषित स्टैटिक टाइप:

\n\n
class Animal { }\nclass Dog: Animal { }\n\nlet pet: Animal = Dog()\nprint(type(of: pet)) // Dog\n\n// टाइप की तुलना\nif type(of: pet) == Dog.self {\n    print("यह निश्चित रूप से एक कुत्ता है!")\n}
\n\n

ध्यान दें: type(of:) डायनामिक टाइप लौटाता है, न कि स्टैटिक टाइप (Animal). यह सामान्य Self से मुख्य अंतर है।

\n\n

3. Mirror — ऑब्जेक्ट्स के लिए एक्स-रे विज़न

\n\n

अब सबसे दिलचस्प भाग। Mirror एक स्ट्रक्चर है जो आपको किसी भी ऑब्जेक्ट के अंदर झाँकने और उसकी प्रॉपर्टीज़, उनके नाम और मानों की सूची प्राप्त करने की अनुमति देता है। Swift में रिफ्लेक्शन का एक वास्तविक उपकरण।

\n\n

बुनियादी उदाहरण:

\n\n
struct User {\n    let name: String\n    var age: Int\n    private var secretKey: String\n}\n\nlet user = User(name: "राहुल", age: 30, secretKey: "abc123")\nlet mirror = Mirror(reflecting: user)\n\nprint("ऑब्जेक्ट का टाइप: \\(mirror.subjectType)")\nprint("प्रॉपर्टीज़ की संख्या: \\(mirror.children.count)")\n\nfor child in mirror.children {\n    if let label = child.label {\n        print("\\(label): \\(child.value)")\n    }\n}
\n\n

आउटपुट:

\n
ऑब्जेक्ट का टाइप: User\nप्रॉपर्टीज़ की संख्या: 3\nname: राहुल\nage: 30\nsecretKey: abc123
\n\n

ध्यान दें: Mirror प्राइवेट प्रॉपर्टीज़ को भी देख सकता है! यह शक्तिशाली है, लेकिन खतरनाक भी — इसका दुरुपयोग न करें।

ब्लॉग

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