2013-02-12 10 views
5

में विभिन्न तर्क प्रकारों के साथ चयनकर्ता मान लीजिए कि हमारे पास अलग-अलग ऑब्जेक्ट है जिसमें एक ही विधि का नाम है लेकिन भिन्न तर्क प्रकारों के साथ: getMethod:(NSNumber*)aNumber और getMethod:(NSString*)aStringउत्तरदाता चयनकर्ता

कैसे, respondsToSelector के साथ या अन्य तरीके से के माध्यम से जांच करने के लिए एक वस्तु इस तरह विशेष तर्क प्रकार, कुछ के साथ चयनकर्ता का जवाब है, तो:

[myObjectA respondsToSelector:@selector(getMethod:(NSNumber*))] 

आप यह कैसे करते हो? धन्यवाद।

+3

आप एक ही नाम और विभिन्न पैरामीटर-प्रकारों के साथ दो विधियों की घोषणा नहीं कर सकते हैं। –

+0

ठीक है, मान लें कि हमारे पास एक ही विधि नाम के साथ विभिन्न प्रकार के ऑब्जेक्ट हैं, लेकिन विभिन्न तर्क प्रकारों के साथ। तब आप क्या करते हो –

+0

आपको [उद्देश्य-सी रनटाइम फ़ंक्शन] का उपयोग करना होगा (https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html#//apple_ref/doc/ यूआईडी/टीपी 40001418) सीधे –

उत्तर

4

आपके पास चयनकर्ता के लिए तर्कों के प्रकार के नाम खोजने के कुछ तरीके हैं। उदाहरण के लिए इस कोड को काम करेगा:

Method method = class_getInstanceMethod([self class], @selector(someMethod:param2:param3:)); 
char type[256]; 
int argsNumber = method_getNumberOfArguments(method); 
for (int i = 0; i < argsNumber; i++) { 
    method_getArgumentType(method, i, type, 256); 
    NSLog(@"%s", type); 
} 

पहले और दूसरे लॉग तर्क प्रणाली और उन्हें सुलझाने में कोई दिलचस्पी नहीं कर रहे हैं, तो एक और पेड़ लाइनों है कि आप की जरूरत है।

भी नीचे कोड आप एक ही परिणाम

NSMethodSignature *sig = [self methodSignatureForSelector:@selector(someMethod:param2:param3:)]; 
int args = [sig numberOfArguments]; 
for (int i = 0; i < args; i++) { 
    NSLog(@"%s", [sig getArgumentTypeAtIndex:i]); 
} 

someMethod:param2:param3: उदाहरण

- (BOOL) someMethod:(NSString *)str param2:(UIView *)view param3:(NSInteger)number 
{ 
    return NO; 
} 

लेकिन के लिए इस तरह कार्यान्वयन हो सकता है दे देंगे! कारण हमारे पास बड़ा है लेकिन यहां)) दोनों स्थितियों में आपके पास const char * स्ट्रिंग के साथ तर्क एक प्रकार के प्रतीक होंगे। कंपाइलर एन्कोड्स का नाम here वर्णित है। आप char से int अलग कर सकते हैं लेकिन NSString से UIView नहीं। सभी आईडी प्रकारों के लिए आपके पास टाइप नाम '@' होगा जिसका अर्थ है कि यह id है। दुखद लेकिन सत्य। दुर्भाग्यवश मुझे पूरा पूरा नाम नाम या डीकोड प्राप्त करने के किसी भी तरीके नहीं मिला है। यदि आपको इस तरह से पता चलेगा कृपया मुझे बताएं।

तो यह समाधान है। आशा है कि आपको अपनी परियोजना में इस दृष्टिकोण का उपयोग करने का तरीका मिलेगा।

+0

धन्यवाद रोस्ट!यहां तक ​​कि यदि आपका उत्तर सीधे मेरे प्रश्न का जवाब नहीं देता है, तो यह रनटाइम के साथ काम करने का एक दिलचस्प तरीका बताता है। –

+0

आशा है कि ऐप्पल लोग एसडीके की फीचर रिलीज में मेरी ज़रूरतों के लिए एक विधि जारी करेंगे। –

+0

यह संदिग्ध है कि वे करेंगे क्योंकि आपकी ज़रूरतें वर्बोज नामकरण के उनके दर्शन के खिलाफ जाती हैं। मेरा सुझाव है कि बस रिफैक्टर करना ताकि उनके नाम हों जो वास्तव में इंगित करते हैं कि वे क्या कर रहे हैं। भले ही यह 'getMethodFromNumber:' या 'getMethodFromString:' के रूप में सरल है – borrrden

0

आप वास्तव में अभ्यस्त तरीकों पैरामीटर प्रकार भेद करने में सक्षम हो सकता है लेकिन हो सकता है आप के बजाय कुछ इस तरह कर सकता है:

if([myObject isKindOfClass:[A class]]) 
    [myObjectA getMethod:aNumber]; 
else if([myObject isKindOfClass:[B class]]) 
    [myObjectA getMethod:aString]; 

आप अभ्यस्त अगर यह चयनकर्ता का जवाब जांच करने की आवश्यकता के बाद से आपको लगता है कि जाँच की है इसके सही प्रकार हो सकता है कि आपकी समस्या इससे अधिक जटिल हो लेकिन यह काम नहीं करना चाहिए यदि यह नहीं है।

+0

पर एन्कोड किए जाएंगे असल में यह मेरे मामले के लिए वांछित वर्कफ़्लो नहीं है। –

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