2009-07-09 12 views
7

मैं एक एनएसएआरएआरई के माध्यम से पुनरावृत्ति कर रहा हूं जिसमें कई अलग-अलग प्रकार की वस्तुएं हैं। यह पता लगाने के लिए कई विधियां हैं कि ऑब्जेक्ट कौन सा वर्ग है। हालांकि, मुझे यह पता लगाने का कोई अच्छा तरीका नहीं मिला है कि कोई ऑब्जेक्ट किसी विशेष फ़ंक्शन को कार्यान्वित कर सकता है या नहीं। मैं इसे एक कोशिश में रख सकता हूं लेकिन अगर मैं त्रुटि को पकड़ रहा हूं तो भी यह कंसोल में एक त्रुटि संदेश आउटपुट करेगा। क्या ऐसा करने के लिए इससे अच्छा तरीका है?मैं कैसे पता लगा सकता हूं कि कोई ऑब्जेक्ट किसी विशेष विधि को लागू करता है या नहीं?

सरल उदाहरण: NSObject के respondsToSelector विधि

+1

चेक कई के रूप में जवाब दे दिया। उद्देश्य-सी में यह प्रोग्रामिंग में त्रुटियों को छोड़कर प्रोग्राम प्रवाह को नियंत्रित करने के अपवादों का उपयोग करने के लिए अच्छी शैली (मेरे और कई अन्य लोगों की राय में) नहीं है। जैसा कि आप जांच रहे हैं कि इस मामले में कोई विधि मौजूद है या नहीं, यह उचित नहीं है। लिंक और कोड उदाहरण के साथ सबसे अच्छे उत्तर के लिए – Abizern

उत्तर

22

के रूप में सुझाव दिया पर

@try { 
    if ([element lowercaseString]) { 
     //do something 
    } 
} 
@catch (id theException) { 
    // do something else 
} 
+1

+1। –

+8

यह मत भूलना कि कोलन चयनकर्ता का एक अविभाज्य हिस्सा हैं। @ सेलेक्टर (कैटफ़िश) @ सेलेक्टर (कैटफ़िश :) से बिल्कुल अलग है। – Chuck

+0

हे, संपत्तियों के लिए कुछ ऐसा करने का कोई तरीका है? अगर मेरे पास एक सामान्य आईडी आइटम है जिसे मैंने सरणी से खींचा है, तो मैं जानना चाहता हूं कि इसकी एक निश्चित संपत्ति है ... – topwik

5

देखो, तुम respondsToSelector: संदेश NSObject पर घोषित उपयोग कर सकते हैं। प्रदान की कोड होगा

if ([element respondsToSelector:@selector(lowercaseString)]) { 
    // ... do work 
} 
1

अपने कोड में है करने के लिए एक अच्छा सामान्य श्रेणी की तरह यह है:

@interface NSObject (KMExtensions) 

- (id)performSelectorIfResponds:(SEL)aSelector; 
- (id)performSelectorIfResponds:(SEL)aSelector withObject:(id)anObject; 

@end 

@implementation NSObject (KMExtensions) 

- (id)performSelectorIfResponds:(SEL)aSelector 
{ 
    if ([self respondsToSelector:aSelector]) { 
     return [self performSelector:aSelector]; 
    } 
    return NULL; 
} 

- (id)performSelectorIfResponds:(SEL)aSelector withObject:(id)anObject 
{ 
    if ([self respondsToSelector:aSelector]) { 
     return [self performSelector:aSelector withObject:anObject]; 
    } 
    return NULL; 
} 

@end 

और फिर आप उपयोग कर सकते हैं: respondsToSelector के लिए

[element performSelectorIfResponds:@selector(lowercaseString)]; 
संबंधित मुद्दे

 संबंधित मुद्दे