उद्देश्य-सी में चयनकर्ता?


122

पहले, मुझे यकीन नहीं है कि मैं वास्तव में समझता हूं कि चयनकर्ता क्या है। मेरी समझ से, यह एक विधि का नाम है, और आप इसे 'SEL' प्रकार के वर्ग के लिए असाइन कर सकते हैं और फिर तरीके जैसे responseToSelector चला सकते हैं कि रिसीवर उस विधि को लागू करता है या नहीं। क्या कोई बेहतर स्पष्टीकरण दे सकता है?

दूसरे, इस बिंदु पर, मेरे पास निम्नलिखित कोड हैं:

NSString *thing = @"Hello, this is Craig";

SEL sel = @selector(lowercaseString:);
NSString *lower = (([thing respondsToSelector:sel]) ? @"YES" : @"NO");
NSLog (@"Responds to lowercaseString: %@", lower);
if ([thing respondsToSelector:sel]) //(lower == @"YES")
    NSLog(@"lowercaseString is: %@", [thing lowercaseString]);

हालाँकि, भले ही thingस्पष्ट रूप से NSString का एक प्रकार है, और लोअरकेसस्ट्रिंग का जवाब देना चाहिए, मुझे "YES" वापस करने के लिए 'respondsToSelector' सशर्त नहीं मिल सकता है ...


आप Apple डेवलपर साइट पर चयनकर्ता विवरण पढ़ना चाहते हैं: चयनकर्ता
लोथर

14
स्टैनफोर्ड कोर्स CS193P असाइनमेंट 1B? मेरे यहाँ बिल्कुल वही सवाल है! :)
कॉर्स्टियन बर्मन

जवाबों:


181

आपको विधि के नामों के बारे में बहुत सावधान रहना होगा। इस मामले में, विधि का नाम सिर्फ " lowercaseString" है, न कि " lowercaseString:" (बृहदान्त्र की अनुपस्थिति पर ध्यान दें)। इसलिए आप NOवापस आ रहे हैं , क्योंकि NSStringऑब्जेक्ट lowercaseStringसंदेश का जवाब देते हैं, लेकिन संदेश का नहीं lowercaseString:

आपको पता है कि कोलन को कब जोड़ना है? यदि आप कॉल करते समय कॉलन जोड़ते हैं, तो आप संदेश नाम में एक कॉलन जोड़ते हैं, जो कि एक तर्क होने पर होता है। यदि यह शून्य तर्क लेता है (जैसा कि मामला है lowercaseString), तो कोई बृहदान्त्र नहीं है। यदि यह एक से अधिक तर्क लेता है, तो आपको अतिरिक्त तर्क नामों को उनके कॉलनों के साथ जोड़ना होगा, जैसे कि compare:options:range:locale:

आप दस्तावेज़ीकरण को भी देख सकते हैं और अनुगामी बृहदान्त्र की उपस्थिति या अनुपस्थिति को नोट कर सकते हैं ।


12

चयनकर्ता सीधे संकलित कोड में तरीकों को संदर्भित करने के लिए एक कुशल तरीका है - संकलक वह है जो वास्तव में एक एसईएल को मूल्य प्रदान करता है।

अन्य आपके q के दूसरे भाग को पहले ही कवर कर चुके हैं, अंत में ':' आप जो खोज रहे हैं, उससे अलग हस्ताक्षर से मेल खाता है (इस मामले में कि हस्ताक्षर मौजूद नहीं है)।


10

ऐसा इसलिए है क्योंकि आप चाहते हैं @selector(lowercaseString), नहीं @selector(lowercaseString:)। एक सूक्ष्म अंतर है: दूसरा एक पैरामीटर का अर्थ है (अंत में कोलन पर ध्यान दें), लेकिन - [NSString lowercaseString]एक पैरामीटर नहीं लेता है।


5

इस मामले में, चयनकर्ता का नाम गलत है। यहाँ बृहदान्त्र विधि हस्ताक्षर का हिस्सा है; इसका मतलब है कि विधि एक तर्क लेती है। मुझे विश्वास है कि आप चाहते हैं

SEL sel = @selector(lowercaseString);


1

फ़ंक्शन नाम के हिस्से के रूप में बृहदान्त्र के बारे में न सोचें, इसे एक विभाजक के रूप में सोचें, यदि आपके पास अलग होने के लिए कुछ भी नहीं है (फ़ंक्शन के साथ जाने के लिए कोई मूल्य नहीं है) तो आपको इसकी आवश्यकता नहीं है।

मुझे यकीन नहीं है क्यों लेकिन यह सब OO सामान Apple डेवलपर्स के लिए विदेशी लगता है। मैं दृढ़ता से विज़ुअल स्टूडियो एक्सप्रेस को हथियाने और उसके साथ खेलने का सुझाव दूंगा इसलिए नहीं कि एक दूसरे से बेहतर है, बस यह डिजाइन मुद्दों और सोचने के तरीकों को देखने का एक अच्छा तरीका है।

पसंद

introspection = reflection
+ before functions/properties = static
- = instance level

किसी समस्या को विभिन्न तरीकों से देखना हमेशा अच्छा होता है और प्रोग्रामिंग अंतिम पहेली है।


0

Apple प्रलेखन की मेरी समझ से, एक चयनकर्ता उस विधि के नाम का प्रतिनिधित्व करता है जिसे आप कॉल करना चाहते हैं। चयनकर्ताओं के बारे में अच्छी बात यह है कि आप उन्हें उन मामलों में उपयोग कर सकते हैं, जिन्हें सटीक विधि कहा जाता है। एक सरल उदाहरण के रूप में, आप कुछ ऐसा कर सकते हैं:

SEL selec;
if (a == b) {
selec = @selector(method1)
}
else
{
selec = @selector(method2)
};
[self performSelector:selec];

0

सेब के डॉक्स के अनुसार: https://developer.apple.com/library/archive/documentation/General/Conceptual/DevPedia-CocoaCore/Selector.html

एक चयनकर्ता एक वस्तु के लिए निष्पादित करने के लिए एक विधि का चयन करने के लिए उपयोग किया जाने वाला नाम है, या अद्वितीय पहचानकर्ता जो स्रोत कोड संकलित होने पर नाम को बदल देता है। एक चयनकर्ता खुद कुछ नहीं करता है। यह बस एक विधि की पहचान करता है। केवल एक चीज जो चयनकर्ता विधि को एक सादे स्ट्रिंग से अलग बनाती है वह यह है कि संकलक यह सुनिश्चित करता है कि चयनकर्ता अद्वितीय हैं। एक चयनकर्ता को जो उपयोगी बनाता है, वह है (रनटाइम के साथ संयोजन में) यह एक गतिशील फ़ंक्शन पॉइंटर की तरह काम करता है, जो किसी दिए गए नाम के लिए, स्वचालित रूप से इसके साथ उपयोग किए जाने वाले वर्ग के लिए उपयुक्त विधि के कार्यान्वयन की ओर इशारा करता है। मान लें कि आपके पास विधि चलाने के लिए एक चयनकर्ता था, और डॉग, एथलीट, और कंप्यूटरसिमुलेशन (जिनमें से प्रत्येक ने एक विधि लागू की है) को कक्षाएं देता है।

उदाहरण: (lldb) ब्रेकपॉइंट - शुरुआत चयनकर्ता viewDidLoad

यह आपके ऐप में सभी व्यूडिलड कार्यान्वयन पर एक ब्रेकपॉइंट सेट करेगा। इसलिए चयनकर्ता एक विधि के लिए एक वैश्विक पहचानकर्ता की तरह है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.