स्विफ्ट स्वयं चयनकर्ताओं का उपयोग नहीं करता है - कई डिज़ाइन पैटर्न जो ऑब्जेक्ट-सी में चयनकर्ताओं का उपयोग स्विफ्ट में अलग तरीके से काम करते हैं। (उदाहरण के लिए, प्रोटोकॉल प्रकारों या is/ asपरीक्षणों के बजाय वैकल्पिक चाइनिंग respondsToSelector:का उपयोग करें, और जहाँ भी आप performSelector:बेहतर / स्मार्ट मेमोरी सुरक्षा के लिए उपयोग कर सकते हैं, वहां क्लोजर का उपयोग करें ।)
लेकिन अभी भी कई महत्वपूर्ण ObjC- आधारित API हैं जो चयनकर्ताओं का उपयोग करते हैं, जिनमें टाइमर और लक्ष्य / एक्शन पैटर्न शामिल हैं। स्विफ्ट Selectorइन के साथ काम करने के लिए प्रकार प्रदान करता है । (स्विफ्ट अपने आप इसे ओबीजीसी के SELप्रकार के स्थान पर उपयोग करता है ।)
स्विफ्ट 2.2 (एक्सकोड 7.3) और बाद में (स्विफ्ट 3 / एक्सकोड 8 और स्विफ्ट 4 / एक्सकोड 9 सहित):
आप अभिव्यक्ति Selectorका उपयोग करके एक स्विफ्ट फ़ंक्शन प्रकार से निर्माण कर सकते हैं #selector।
let timer = Timer(timeInterval: 1, target: object,
selector: #selector(MyClass.test),
userInfo: nil, repeats: false)
button.addTarget(object, action: #selector(MyClass.buttonTapped),
for: .touchUpInside)
view.perform(#selector(UIView.insertSubview(_:aboveSubview:)),
with: button, with: otherButton)
इस दृष्टिकोण के बारे में महान बात? एक फ़ंक्शन संदर्भ स्विफ्ट कंपाइलर द्वारा जांचा जाता है, इसलिए आप #selectorकेवल क्लास / मेथोड जोड़े के साथ अभिव्यक्ति का उपयोग कर सकते हैं जो वास्तव में मौजूद हैं और चयनकर्ताओं के रूप में उपयोग के लिए योग्य हैं (नीचे "चयनकर्ता उपलब्धता देखें")। आप फ़ंक्शन-टाइपिंग नामकरण के लिए स्विफ्ट 2.2+ नियमों के अनुसार, अपने फ़ंक्शन को केवल आवश्यकतानुसार विशिष्ट बनाने के लिए स्वतंत्र हैं ।
(यह वास्तव में ObjC के @selector()निर्देश पर एक सुधार है , क्योंकि संकलक की -Wundeclared-selectorजांच केवल यह बताती है कि नामित चयनकर्ता मौजूद है। स्विफ्ट फ़ंक्शन संदर्भ आप #selectorअस्तित्व की जांच करने के लिए पास करते हैं, एक वर्ग में सदस्यता, और हस्ताक्षर टाइप करते हैं।)
#selectorअभिव्यक्ति के लिए जाने वाले फ़ंक्शन संदर्भों के लिए कुछ अतिरिक्त चेतावनी हैं :
- एक ही आधार नाम के साथ कई फ़ंक्शन फ़ंक्शन संदर्भ (उदाहरण
insertSubview(_:at:)बनाम insertSubview(_:aboveSubview:)) के लिए उपरोक्त सिंटैक्स का उपयोग करके उनके पैरामीटर लेबल द्वारा विभेदित किए जा सकते हैं । लेकिन अगर किसी फ़ंक्शन का कोई पैरामीटर नहीं है, asतो फ़ंक्शन के प्रकार हस्ताक्षर (जैसे foo as () -> ()बनाम foo(_:)) के साथ कलाकारों का उपयोग करने का एकमात्र तरीका है ।
- स्विफ्ट 3.0+ में संपत्ति पाने वाले / सेटर जोड़े के लिए एक विशेष वाक्यविन्यास है। उदाहरण के लिए, दिए गए
var foo: Int, आप उपयोग कर सकते हैं #selector(getter: MyClass.foo)या #selector(setter: MyClass.foo)।
सामान्य टिप्पणी:
ऐसे मामले जहां #selectorकाम नहीं करता है, और नामकरण: कभी-कभी आपके पास चयनकर्ता बनाने के लिए एक फ़ंक्शन संदर्भ नहीं होता है (उदाहरण के लिए, ओबजैक रनटाइम में गतिशील रूप से पंजीकृत तरीकों के साथ)। उस स्थिति में, आप Selectorएक स्ट्रिंग से निर्माण कर सकते हैं : जैसे Selector("dynamicMethod:")- यद्यपि आप संकलक की वैधता जाँच खो देते हैं। जब आप ऐसा करते हैं, तो आपको :प्रत्येक पैरामीटर के लिए colons ( ) सहित ObjC नामकरण नियमों का पालन करने की आवश्यकता होती है ।
चयनकर्ता की उपलब्धता: चयनकर्ता द्वारा संदर्भित विधि को ओबीजीसी रनटाइम से अवगत कराया जाना चाहिए। स्विफ्ट 4 में, ObjC के सामने आने वाली हर विधि की @objcविशेषता के साथ इसकी घोषणा पूर्व निर्धारित होनी चाहिए । (पिछले संस्करणों में आपको कुछ मामलों में वह विशेषता मुफ्त में मिली थी, लेकिन अब आपको इसे स्पष्ट रूप से घोषित करना होगा।)
उसे याद रखो private प्रतीकों को रनटाइम के संपर्क में नहीं किया जाता है, भी - आपकी विधि को कम से कम internalदृश्यता की आवश्यकता है।
मुख्य पथ: ये संबंधित हैं, लेकिन चयनकर्ताओं के समान नहीं हैं। स्विफ्ट 3 में इनके लिए एक विशेष वाक्यविन्यास है, जैसे: उदा chris.valueForKeyPath(#keyPath(Person.friends.firstName))। देखें एसई 0062 जानकारी के लिए। और भी अधिकKeyPath स्विफ्ट 4 में सामान , इसलिए सुनिश्चित करें कि आप उचित KeyPath- आधारित एपीआई का उपयोग कर रहे हैं यदि चयनकर्ताओं के बजाय उचित हो।
आप के तहत चयनकर्ताओं के बारे में अधिक पढ़ सकते हैं ऑब्जेक्टिव-सी एपीआई के साथ बातचीत में कोको और ऑब्जेक्टिव-सी के साथ स्विफ्ट का उपयोग करना ।
नोट: स्विफ्ट 2.2 से पहले, के Selectorअनुरूप है StringLiteralConvertible, इसलिए आपको पुराना कोड मिल सकता है जहां चयन करने वाले एपीआई को नंगे तार दिए जाते हैं। आप का उपयोग करने के लिए Xcode में "कन्वर्ट करने के लिए वर्तमान स्विफ्ट सिंटैक्स" चलाना चाहते हैं #selector।
selector: test()कॉलtestऔर पास होगा यहselectorतर्क के लिए वापसी मूल्य है ।