Swift में @selector(): ObjC-संगतता के लिए पूर्ण गाइड

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

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

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

Swift में @selector() क्या है और इसकी आवश्यकता क्यों है?

\n\n

यदि आपने कभी Objective-C के साथ काम किया है या पुराने कोड का सामना किया है, तो आपने निश्चित रूप से जादुई संरचना @selector() के बारे में सुना होगा। Swift में यह #selector में बदल गया है, लेकिन सार वही रहा: यह Swift की स्थिर टाइपिंग और Objective-C runtime की गतिशील प्रकृति के बीच एक पुल है।

\n\n

कल्पना करें कि आपको एक विधि का संदर्भ एक तर्क के रूप में पास करना है। उदाहरण के लिए, बटन दबाने की कार्रवाई या सूचनाओं की सदस्यता लेने के लिए। Swift में हम क्लोजर का उपयोग करने के आदी हैं, लेकिन Apple की लाइब्रेरीज़ (UIKit, AppKit, Foundation) अभी भी पुराने और अच्छे सेलेक्टर तंत्र पर निर्भर हैं। यहीं पर Swift में @selector() एक अपरिहार्य उपकरण बन जाता है।

\n\n

इस गाइड में हम निम्नलिखित पर चर्चा करेंगे:

\n
    \n
  • आधुनिक Swift में सेलेक्टर को सही तरीके से कैसे घोषित करें
  • \n
  • सामान्य गलतियाँ और उनसे बचने के तरीके
  • \n
  • iOS डेवलपमेंट से वास्तविक उदाहरण
  • \n
  • #selector का उपयोग कब करें और विकल्प कब चुनें
  • \n
\n\n

@selector() से #selector तक: सिंटैक्स का विकास

\n\n

Objective-C में सेलेक्टर इस तरह दिखता है:

\n
[@selector(buttonTapped:)]
\n\n

Swift 2.0 में #selector संरचना दिखाई दी, जो मानक बन गई। अब यह इस तरह दिखता है:

\n
#selector(MyClass.buttonTapped(_:))
\n\n

मुख्य अंतर: Swift में #selector कंपाइलर द्वारा जाँचा जाता है। यदि आप विधि के नाम में गलती करते हैं या गलत सिग्नेचर पास करते हैं, तो कंपाइलर एक त्रुटि देगा। यह Objective-C की तुलना में एक बड़ा लाभ है, जहाँ सेलेक्टर केवल एक स्ट्रिंग है और त्रुटि केवल runtime में सामने आएगी।

\n\n

#selector के लिए विधियाँ घोषित करने के नियम

\n\n

जिस विधि को आप #selector में पास करते हैं, वह होनी चाहिए:

\n
    \n
  • Objective-C से सुलभ — @objc विशेषता से चिह्नित
  • \n
  • निजी नहीं (या @objc private के रूप में चिह्नित)
  • \n
  • सिग्नेचर में संगत उससे जो कॉल करने वाला पक्ष अपेक्षा करता है
  • \n
\n\n

सही घोषणा का उदाहरण:

\n
class ViewController: UIViewController {\n    @objc func buttonTapped(_ sender: UIButton) {\n        print("बटन दबाया गया!")\n    }\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        let button = UIButton(type: .system)\n        button.addTarget(self, action: #selector(buttonTapped(_:)), for: .touchUpInside)\n    }\n}
\n\n

विधि से पहले @objc पर ध्यान दें। इसके बिना कंपाइलर #selector का उपयोग करने की अनुमति नहीं देगा।

\n\n

@selector() Swift: व्यावहारिक उदाहरण

\n\n

1. Target-Action: बटन और जेस्चर

\n\n

#selector के उपयोग का सबसे सामान्य परिदृश्य UI तत्वों के साथ क्रियाओं को जोड़ना है:

\n\n
class ProfileViewController: UIViewController {\n    \n    @objc private func avatarTapped(_ gesture: UITapGestureRecognizer) {\n        print("अवतार दबाया गया")\n    }\n    \n    @objc private func settingsButtonPressed() {\n        print("सेटिंग्स खोलें")\n    }\n    \n    override func viewDidLoad() {\n        super.viewDidLoad()\n        \n        // जेस्चर\n        let tapGesture = UITapGestureRecognizer(target: self, action: #selector(avatarTapped(_:)))\n        avatarImageView.addGestureRecognizer(tapGesture)\n        \n        // बटन\n        settingsButton.addTarget(self, action: #selector(settingsButtonPressed), for: .touchUpInside)\n    }\n}
\n\n

याद रखें: यदि विधि एक पैरामीटर लेती है (उदाहरण के लिए, UITapGestureRecognizer), तो आपको सेलेक्टर सिग्नेचर में _ इंगित करना होगा: #selector(avatarTapped(_:))।

\n\n

2. PerformSelector और विलंबित कॉल

\n\n

कभी-कभी किसी विधि को गतिशील रूप से कॉल करने की आवश्यकता होती है, विशेष रूप से KVO या टाइमर के साथ काम करते समय:

\n\n
class TimerManager {\n    @objc func fireTimer() {\n                

ब्लॉग

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