Swift में प्रोटोकॉल: वैकल्पिक विधियाँ कैसे घोषित करें (पूर्ण विश्लेषण)

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

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

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

Swift में प्रोटोकॉल: वैकल्पिक विधियाँ कैसे घोषित करें (पूर्ण गाइड)

\n\n

क्या आपने कभी Swift में कोई प्रोटोकॉल लिखा है और चाहा है कि कोई विधि वैकल्पिक हो? ताकि प्रोटोकॉल को अपनाने वाला वर्ग इस विधि को लागू न करे, और कंपाइलर त्रुटि न दे? यदि हाँ — तो आप अकेले नहीं हैं। Stack Overflow के इस प्रश्न ने हज़ारों बार देखा गया है, और आज हम एक बार और हमेशा के लिए समझेंगे कि Swift protocol में optional methods कैसे काम करते हैं।

\n\n

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

\n\n

Swift Optional Methods को क्यों पसंद नहीं करता?

\n\n

Objective-C में, प्रोटोकॉल विधियों को @optional के रूप में चिह्नित कर सकते थे, और सब कुछ काम करता था। Swift को शुरू से ही सुरक्षा पर ध्यान केंद्रित करके बनाया गया था। यदि कोई प्रोटोकॉल कोई विधि घोषित करता है — तो इसका मतलब है कि इसे अपनाने वाला कोई भी वर्ग इसे लागू करने के लिए बाध्य है। अन्यथा — कंपाइलेशन त्रुटि। यह अच्छा है, क्योंकि आप कोई महत्वपूर्ण विधि लागू करना नहीं भूलेंगे, और कोड पूर्वानुमानित हो जाता है।

\n\n

लेकिन वास्तविक जीवन में अक्सर यह आवश्यक होता है: "यदि चाहें तो विधि लागू करें, अन्यथा डिफ़ॉल्ट व्यवहार का उपयोग करें।" क्या करें? तीन मुख्य तरीके हैं।

\n\n

तरीका 1: @objc और optional (क्लासिक, लेकिन शर्तों के साथ)

\n\n

सबसे पुराना और सरल तरीका @objc विशेषता का उपयोग करना है। यह प्रोटोकॉल को Objective-C runtime की दुनिया में ले जाता है, जहाँ वैकल्पिक विधियाँ "बॉक्स से बाहर" मौजूद हैं।

\n\n
import Foundation\n\n@objc protocol DataSource {\n    @objc optional func fetchData() -> [String]\n    func mandatoryMethod()\n}\n\nclass MyViewController: UIViewController, DataSource {\n    func mandatoryMethod() {\n        print("अनिवार्य विधि लागू की गई")\n    }\n    // fetchData() को लागू नहीं कर सकते\n}\n\n// उपयोग:\nlet vc = MyViewController()\nvc.fetchData?() // सुरक्षित कॉल — कुछ नहीं होगा\nvc.mandatoryMethod()
\n\n

लाभ: सरलता, स्पष्ट सिंटैक्स, डेलीगेट्स के साथ काम करता है।

\n

नुकसान:

\n
    \n
  • प्रोटोकॉल का उपयोग केवल क्लासेस के साथ किया जा सकता है (स्ट्रक्चर, एनुम नहीं)।
  • \n
  • पूरे प्रोटोकॉल को @objc से चिह्नित किया जाना चाहिए।
  • \n
  • आप Swift-विशिष्ट क्षमताओं (associated types, where clauses) का कुछ हिस्सा खो देते हैं।
  • \n
\n\n

यह विकल्प आदर्श है यदि आप iOS/macOS के लिए लिख रहे हैं और UIKit (जैसे, UITableView डेलीगेट्स) के साथ काम कर रहे हैं। लेकिन शुद्ध Swift कोड के लिए, अन्य दृष्टिकोणों का उपयोग करना बेहतर है।

\n\n

तरीका 2: डिफ़ॉल्ट कार्यान्वयन के साथ प्रोटोकॉल एक्सटेंशन (अनुशंसित)

\n\n

यह सबसे Swift-way तरीका है। आप अनिवार्य विधियों के साथ एक प्रोटोकॉल घोषित करते हैं, और फिर एक्सटेंशन में उन विधियों के लिए "डिफ़ॉल्ट" कार्यान्वयन देते हैं जिन्हें आप वैकल्पिक बनाना चाहते हैं।

\n\n
protocol Configurable {\n    func configureUI()\n    func setupBindings() // हम इसे वैकल्पिक बनाना चाहते हैं\n}\n\nextension Configurable {\n    func setupBindings() {\n        // डिफ़ॉल्ट खाली कार्यान्वयन\n        print("बाइंडिंग कॉन्फ़िगर नहीं की गई (डिफ़ॉल्ट कार्यान्वयन का उपयोग किया गया)")\n    }\n}\n\nclass MyView: Configurable {\n    func configureUI() {\n        print("UI कॉन्फ़िगर किया गया")\n    }\n    // setupBindings() लिखने की आवश्यकता नहीं है — एक्सटेंशन से कार्यान्वयन का उपयोग किया जाएगा\n}\n\nclass AdvancedView: Configurable {\n    func configureUI() {\n        print("उन्नत UI")\n    }\n    func setupBindings() {\n        print("अपने बाइंडिंग")\n    }\n}\n\nlet view = MyView()\nview.setupBindings() // आउटपुट: "बाइंडिंग कॉन्फ़िगर नहीं की गई (डिफ़ॉल्ट कार्यान्वयन का उपयोग किया गया)"\n\nlet advanced = AdvancedView()\nadvanced.setupBindings() // आउटपुट: "अपने बाइंडिंग"
\n\n

यह क्यों अच्छा है?

\n
    \n
  • क्लासेस, स्ट्रक्चर और एनुम के साथ काम करता है।
  • \n
  • पूरी तरह से Swift-नेटिव, बिना objc के।

ब्लॉग

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