Swift 3 @objc inference deprecated: Swift 4 में क्या करें

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

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

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

Swift 3 @objc inference अतीत की बात क्यों हो रही है?

\n\n

यदि आपने कभी अपने प्रोजेक्ट को Swift 3 से Swift 4 में अपडेट किया है, तो आपने निश्चित रूप से कंपाइलर की एक डरावनी चेतावनी देखी होगी:

\n\n
The use of Swift 3 @objc inference in Swift 4 mode is deprecated. \nPlease address this deprecated @objc inference warning, \nor disable the warning by setting the "Swift 3 @objc Inference" \nbuild setting to "Default" for the "Swift 4" target.
\n\n

यह संदेश केवल एक औपचारिकता नहीं है। इसके पीछे भाषा के दर्शन में एक महत्वपूर्ण बदलाव है। Swift 3 में, कंपाइलर स्वयं तय करता था कि किन विधियों और गुणों को Objective-C के लिए दृश्यमान बनाया जाए। यह सुविधाजनक था, लेकिन इसने छिपी हुई समस्याएँ पैदा कीं: बाइनरी का आकार बढ़ गया और प्रदर्शन कम हो गया। Swift 4 ने इस "अनुमान लगाने" को समाप्त करने और नियंत्रण डेवलपर को वापस देने का निर्णय लिया।

\n\n

इस लेख में, हम समझेंगे कि @objc inference क्या है, इसे deprecated क्यों किया गया, चेतावनी को कैसे ठीक करें, और आधुनिक प्रोजेक्ट्स में किन सर्वोत्तम प्रथाओं का उपयोग करें। चलिए शुरू करते हैं!

\n\n

@objc inference क्या है और Swift 3 में यह कैसे काम करता था?

\n\n

Swift 3 में, @objc का एक अंतर्निहित (implicit) रूपांतरण मौजूद था। इसका मतलब था कि यदि कोई क्लास NSObject से विरासत प्राप्त करती थी या @objc प्रोटोकॉल का उपयोग करती थी, तो कंपाइलर स्वचालित रूप से उसकी सभी विधियों को Objective-C के लिए दृश्यमान बना देता था। इस तंत्र को @objc inference (अंतर्निहित निष्कर्ष) कहा जाता था।

\n\n

Swift 3 का उदाहरण:

\n\n
class MyViewController: UIViewController {\n    func buttonTapped() {\n        print("Button tapped")\n    }\n}
\n\n

Swift 3 में, विधि buttonTapped() स्वचालित रूप से @objc बन जाती थी। आप इसे #selector में पास कर सकते थे या UIControl के लिए target के रूप में उपयोग कर सकते थे। सुविधाजनक? हाँ। लेकिन इसकी कीमत थी बाइनरी का अनावश्यक रूप से बढ़ना और ऑप्टिमाइज़ेशन का नुकसान।

\n\n

Apple ने स्वचालित निष्कर्ष को क्यों छोड़ने का फैसला किया?

\n\n

इसके कई कारण हैं, और सभी दक्षता और नियंत्रण से संबंधित हैं:

\n\n
    \n
  • एप्लिकेशन का आकार. @objc के रूप में चिह्नित प्रत्येक विधि, Objective-C runtime के लिए एक अतिरिक्त रैपर उत्पन्न करती है। बड़े प्रोजेक्ट्स में, यह मेगाबाइट्स अतिरिक्त कोड जोड़ सकता है।
  • \n
  • प्रदर्शन. Swift एक स्थिर टाइपिंग और शक्तिशाली ऑप्टिमाइज़ेशन वाली भाषा है। जैसे ही कोई विधि @objc बनती है, कंपाइलर कई ऑप्टिमाइज़ेशन (जैसे इनलाइनिंग) लागू करने की क्षमता खो देता है।
  • \n
  • स्पष्टता. Swift 4 ने स्पष्टता पर ध्यान केंद्रित किया। डेवलपर को स्वयं तय करना चाहिए कि Objective-C से क्या सुलभ होना चाहिए। इससे कोड को समझना आसान हो जाता है और अप्रत्याशित त्रुटियाँ कम होती हैं।
  • \n
  • Swift का भविष्य. Apple धीरे-धीरे Objective-C पर निर्भरता से दूर हो रहा है। जितने कम अंतर्निहित पुल होंगे, उतनी ही तेज़ी से Swift पूरी तरह से स्वतंत्र भाषा बन सकेगी।
  • \n
\n\n

व्यवहार में चेतावनी कैसी दिखती है?

\n\n

मान लीजिए, आपके पास Swift 3 में लिखा गया एक प्रोजेक्ट है। आप "Swift Language Version" सेटिंग को Swift 4.0 पर स्विच करते हैं और दर्जनों (या सैकड़ों) ऐसी चेतावनियाँ प्राप्त करते हैं:

\n\n
class LegacyViewController: UIViewController {\n    // चेतावनी: Swift 4 मोड में Swift 3 @objc inference का उपयोग deprecated है\n    func legacyAction() {\n        // ...\n    }\n\n    @objc func explicitAction() {\n        // यह विधि पहले से @objc से चिह्नित है — सब ठीक है\n    }\n}
\n\n

कंपाइलर legacyAction() पर आपत्ति करता है, क्योंकि यह @objc से चिह्नित नहीं है, लेकिन पहले कंपाइलर इसे स्वचालित रूप से करता था। अब एक समाधान की आवश्यकता है।

\n\n

चेतावनी को ठीक करने के तीन तरीके

\n\n

आपके पास कार्रवाई के तीन विकल्प हैं। वह चुनें जो आपके लिए उपयुक्त हो।

ब्लॉग

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