जब भी मैं अपने कोड में एक विधि लागू करता हूं जो एक से अधिक कक्षाओं की वस्तुओं को स्वीकार या वापस कर सकता है, तो मैं हमेशा उपलब्ध सबसे विशिष्ट सुपरक्लास का उपयोग करने का प्रयास करता हूं। उदाहरण के लिए, यदि मैं एक ऐसे तरीके को लागू करने जा रहा था जो उसके इनपुट के आधार पर एक एनएसएआरएआर * या एनएस डिक्शनरी * वापस कर सकता है, तो मैं उस विधि को एनएसओब्जेक्ट * का रिटर्न प्रकार दूंगा, क्योंकि यह सबसे प्रत्यक्ष आम सुपरक्लास है।एक विधि हस्ताक्षर में (आईडी) का उपयोग क्यों करें (NSObject *) अधिक सटीक होगा?
@interface MyParser()
- (BOOL)stringExpressesKeyValuePairs:(NSString *)string;
- (BOOL)stringExpressesAListOfEntities:(NSString *)string;
- (NSArray *)parseArrayFromString:(NSString *)string;
- (NSDictionary *)parseDictionaryFromString:(NSString *)string;
@end
@implementation MyParser
- (NSObject *)parseString:(NSString *)string {
if ([self stringExpressesKeyValuePairs:string]) {
return [self parseDictionaryFromString:string];
}
else if ([self stringExpressesAListOfEntities:string]) {
return [self parseArrayFromString:string];
}
}
// etc...
@end
मैं फाउंडेशन और अन्य API में कई मामलों में जहां कुछ विधि हस्ताक्षर में एप्पल का उपयोग करता है (आईडी) जब (NSObject *) और अधिक सटीक होगा ध्यान दिया है: यहाँ एक उदाहरण है। उदाहरण के लिए, यहाँ NSPropertyListSerialization की एक विधि है:
+ (id)propertyListFromData:(NSData *)data
mutabilityOption:(NSPropertyListMutabilityOptions)opt
format:(NSPropertyListFormat *)format
errorDescription:(NSString **)errorString
इस विधि से संभावित वापसी प्रकार NSData, NSString, NSArray, NSDictionary, NSDate, और NSNumber हैं। ऐसा लगता है कि एक वापसी प्रकार (एनएसओब्जेक्ट *) (आईडी) से बेहतर विकल्प होगा, क्योंकि कॉलर एनएसओब्जेक्ट विधियों को कॉल करने में सक्षम होगा जैसे कि टाइप-कास्ट के बिना बनाए रखें।
मैं आम तौर पर आधिकारिक ढांचे द्वारा स्थापित मुहावरों का अनुकरण करने की कोशिश करता हूं, लेकिन मैं यह भी समझना चाहता हूं कि उन्हें क्या प्रेरित करता है। मुझे यकीन है कि ऐप्पल के पास इस तरह के मामलों में (आईडी) का उपयोग करने के लिए कुछ वैध कारण है, लेकिन मैं इसे देख नहीं रहा हूं। मैं क्या खो रहा हूँ?
एनएसपीरोक्सी एनएसओब्जेक्ट नहीं है। एनएसओब्जेक्ट एकमात्र मूल वर्ग नहीं है, इसलिए यह एक सुरक्षित धारणा नहीं है कि सब कुछ इसके उप-वर्ग होगा। –