2012-11-07 25 views
5

विधि [NSString stringWithFormat] एक id प्रकार क्यों देता है? नाम से मुझे उम्मीद है कि यह एक सामान्य सूचक नहीं, NSString देता है। अन्य वर्ग इस "नियम" का पालन करते हैं। उदाहरण के लिए [NSNumber numberWithInt]NSNumber देता है, id नहीं।एनएसएसटींग स्ट्रिंगविथफॉर्मैट रिटर्न टाइप, यह "आईडी" क्यों है?

मुझे लगता है कि यह तथ्य से भी उचित नहीं है कि फैक्ट्री विधि की तरह कुछ है।

+1

उपवर्गीकरण के लिए:

उदाहरण के लिए (और मैं एक उदाहरण के तनाव, इस वास्तविक ढांचे में ऐसा नहीं हो सकता है)। 'NSMutableString' उस मामले में एक कलाकार की आवश्यकता होगी। –

+0

हाँ, मैं सहमत हूं - आप एक टैप नृत्य कर सकते हैं कि यह किस तरह से है, लेकिन आखिरकार यह समझ में नहीं आता है। –

उत्तर

6

आप NSNumber का उल्लेख है, यह किसी भी प्रत्यक्ष उपवर्गों नहीं है, तो यह सुरक्षित है numberWithInt: (जैसे NSSet के रूप में और अन्य वर्गों) वापसी प्रकार id क्योंकि वे उपवर्गों हो सकता है एक NSNumber*

NSString* वापस जाने के लिए के लिए (NSMutableString और NSMutableSet क्रमशः), जो इस विधि का वारिस करेगा। इस प्रकार, इन विरासत में कॉलों को सबक्लास के प्रकार का एक उदाहरण वापस करने की आवश्यकता होती है, और विधि नामकरण के नियमों के कारण, आप अकेले रिटर्न प्रकार के आधार पर ओवरलोड नहीं कर सकते हैं। इस प्रकार, उन्हें उन सभी के बीच एक सामान्य प्रकार की आवश्यकता है, जो id है।

अद्यतन: हालिया घटनाओं का अर्थ कीवर्ड instancetype अब उपलब्ध है। आपने देखा होगा कि id के कई संदर्भ अब instancetype के साथ प्रतिस्थापित किए गए हैं। यह कीवर्ड कंपाइलर को एक संकेत प्रदान करता है कि विधि का रिटर्न प्रकार विधि के प्राप्तकर्ता का एक ही वर्ग है।

NSArray: 
- (instancetype)initWithArray:(NSArray*)array; 

NSMutableArray: 
// Inherits from NSArray 

---- 

// Receiver is NSArray, method belongs in NSArray, returns an NSArray 
[[NSArray alloc] initWithArray:@[]]; 

// Receiver is NSMutableArray, method belongs in NSArray, returns an NSMutableArray 
[[NSMutableArray alloc] initWithArray:@[]]; 
+0

ठीक है, मैंने कभी नहीं सोचा था कि मैं [NSMutableString stringWithFormat] कॉल कर सकता हूं। आम तौर पर मैंने एक खाली एनएसएमयूटेबल स्ट्रिंग और फिर प्रारूपों को जोड़ दिया। कक्षा पदानुक्रम की मेरी समझ जावा अनुभव से पक्षपातपूर्ण है जहां स्ट्रिंग स्ट्रिंगबिल्डर का एक सुपर क्लास नहीं है। – giampaolo

+0

कक्षा का उत्परिवर्तनीय संस्करण हमेशा इसके ठोस समकक्ष का उप-वर्ग होता है। कोको के लिए यह समझ में आता है, म्यूटेबल क्लास कंक्रीट के समान है, कुछ घंटियां और सीटों को पढ़ने के बजाय इसे पढ़ने के लिए जोड़ा गया है :) – WDUK

+0

@WDUK picky, 'NSNumber' एक क्लास क्लस्टर है, इसलिए इसमें बहुत सारे उप-वर्ग हैं, बस वे निजी हैं। –

5

क्योंकि यह कक्षा एनएसएसटींग पर एक स्थिर विधि है और इसे ऑब्जेक्ट के प्रकार को वापस करने के लिए माना जाता है। यह इस प्रकार पर भी निर्भर है क्योंकि यह एनएसएमयूटेबलस्ट्रिंग से आ सकता है।