Swift में @selector() क्या है और इसकी आवश्यकता क्यों है?
\n\nयदि आपने कभी Objective-C के साथ काम किया है या पुराने कोड का सामना किया है, तो आपने निश्चित रूप से जादुई संरचना @selector() के बारे में सुना होगा। Swift में यह #selector में बदल गया है, लेकिन सार वही रहा: यह Swift की स्थिर टाइपिंग और Objective-C runtime की गतिशील प्रकृति के बीच एक पुल है।
कल्पना करें कि आपको एक विधि का संदर्भ एक तर्क के रूप में पास करना है। उदाहरण के लिए, बटन दबाने की कार्रवाई या सूचनाओं की सदस्यता लेने के लिए। Swift में हम क्लोजर का उपयोग करने के आदी हैं, लेकिन Apple की लाइब्रेरीज़ (UIKit, AppKit, Foundation) अभी भी पुराने और अच्छे सेलेक्टर तंत्र पर निर्भर हैं। यहीं पर Swift में @selector() एक अपरिहार्य उपकरण बन जाता है।
\n\nइस गाइड में हम निम्नलिखित पर चर्चा करेंगे:
\n- \n
- आधुनिक Swift में सेलेक्टर को सही तरीके से कैसे घोषित करें \n
- सामान्य गलतियाँ और उनसे बचने के तरीके \n
- iOS डेवलपमेंट से वास्तविक उदाहरण \n
#selectorका उपयोग कब करें और विकल्प कब चुनें \n
@selector() से #selector तक: सिंटैक्स का विकास
\n\nObjective-C में सेलेक्टर इस तरह दिखता है:
\n[@selector(buttonTapped:)]\n\nSwift 2.0 में #selector संरचना दिखाई दी, जो मानक बन गई। अब यह इस तरह दिखता है:
#selector(MyClass.buttonTapped(_:))\n\nमुख्य अंतर: Swift में #selector कंपाइलर द्वारा जाँचा जाता है। यदि आप विधि के नाम में गलती करते हैं या गलत सिग्नेचर पास करते हैं, तो कंपाइलर एक त्रुटि देगा। यह Objective-C की तुलना में एक बड़ा लाभ है, जहाँ सेलेक्टर केवल एक स्ट्रिंग है और त्रुटि केवल runtime में सामने आएगी।
\n\n#selector के लिए विधियाँ घोषित करने के नियम
\n\nजिस विधि को आप #selector में पास करते हैं, वह होनी चाहिए:
- \n
- Objective-C से सुलभ —
@objcविशेषता से चिह्नित \n - निजी नहीं (या
@objc privateके रूप में चिह्नित) \n - सिग्नेचर में संगत उससे जो कॉल करने वाला पक्ष अपेक्षा करता है \n
सही घोषणा का उदाहरण:
\nclass 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 का उपयोग करने की अनुमति नहीं देगा।
@selector() Swift: व्यावहारिक उदाहरण
\n\n1. Target-Action: बटन और जेस्चर
\n\n#selector के उपयोग का सबसे सामान्य परिदृश्य UI तत्वों के साथ क्रियाओं को जोड़ना है:
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(_:))।
2. PerformSelector और विलंबित कॉल
\n\nकभी-कभी किसी विधि को गतिशील रूप से कॉल करने की आवश्यकता होती है, विशेष रूप से KVO या टाइमर के साथ काम करते समय:
\n\nclass TimerManager {\n @objc func fireTimer() {\n