यह एसओ पर पोस्ट "ब्लॉक के प्रकार की जांच कर सकता है" पोस्ट से अलग है, जहां तक मैं वैसे भी बता सकता हूं।उद्देश्य-सी प्रकार एक ब्लॉक की जांच करें?
मैं जानना चाहता हूं कि अज्ञात हस्ताक्षर के ब्लॉक ऑब्जेक्ट को देखते हुए, मैं यह जान सकता हूं कि यह किस तर्क को आमंत्रित करने से पहले स्वीकार करता है?
मेरे पास ऐसी स्थिति है जहां मेरे पास शब्दकोश में ऑब्जेक्ट्स से जुड़े कई कॉलबैक हैं। मैं उन कॉलबैक में से कुछ को तर्कों के एक अलग सेट की अपेक्षा करना चाहता हूं। यहां का उदाहरण बेहद सरल है, लेकिन मुझे लगता है कि यह बिंदु पूरी हो जाता है।
मैं कैसे पता लगा सकता हूं कि एक ब्लॉक एक प्रकार का है जिसे मैंने पहले टाइप किया था?
//MyClass.m
// I start by declare two block types
typedef void (^callbackWithOneParam)(NSString*);
typedef void (^callbackWithTwoParams)(NSString*, NSObject*);
........
// I create a dictionary mapping objects to callback blocks
self.dict = @{
@"name": "Foo",
@"callback": ^(NSString *aString) {
// do stuff with string
}
}, {
@"name": "Bar",
@"callback": ^(NSString *aString, NSObject *anObject) {
// do stuff with string AND object
}
}
.....
// Later, this method is called.
// It looks up the "name" parameter in our dictionary,
// and invokes the associated callback accordingly.
-(void) invokeCallbackForName:(NSString*)name {
// What is the type of the result of this expression?
[self.dict objectForKey: name]
// I want to say: (pseudocode)
thecallback = [self.dict objectForKey: name];
if (thecallback is of type "callbackWithOneParam") {
thecallback(@"some param")
}
else if (thecallback is of type "callbackWithTwoParams") {
thecallback(@"some param", [[NSObject alloc] init]);
}
}
मैं आप नहीं कर सकते लगता है। आपकी स्थिति में आप अतिरिक्त पैरामीटर NSObject छोड़ सकते हैं और यदि आप इसका उपयोग नहीं करते हैं तो शून्य डाल दें। – SAKrisT
इस उदाहरण में शब्दकोश के भीतर सभी ब्लॉक के लिए एक निरंतर हस्ताक्षर का उपयोग करना अधिक बेहतर है। प्रत्येक ब्लॉक के भीतर कोड स्वतंत्र रूप से तय कर सकता है कि कौन से पैरामीटर का उपयोग किया जाएगा या अनदेखा किया जाएगा। ब्लॉक को कॉल करने से पहले आपको अपने ब्लॉक हस्ताक्षर में '-objectForKey:' से वापसी मूल्य भी डालना होगा। आपको प्रत्येक ब्लॉक को शब्दकोश में जोड़ने से पहले ढेर में भी कॉपी करना होगा। – Darren
डैरेन क्या आप अपने पिछले दो बयानों के बारे में विस्तार से बता सकते हैं, धन्यवाद! –