मैं ऑब्जेक्टिव-सी में कई पैरामीटर कैसे पास करूं?


178

मैंने ऑब्जेक्टिव-सी विधि सिंटैक्स के बारे में कई पोस्ट पढ़े हैं, लेकिन मुझे लगता है कि मैं एक विधि के लिए कई नामों को नहीं समझता।

मैं एक विधि कहा जाता है बनाने के लिए कोशिश कर रहा हूँ getBusStopsके साथ NSStringऔर NSTimeIntervalमापदंडों और की वापसी प्रकार NSMutableArray। इस तरह मैंने विधि का निर्माण किया है, लेकिन यह स्पष्ट रूप से रनटाइम पर त्रुटियां प्राप्त करता है:

- (NSMutableArray *)getBusStops:(NSString *)busStop
                                (NSTimeInterval *)timeInterval;

मैंने एक विधि के साथ एक और उदाहरण देखा:

-(NSInteger)pickerView:(UIPickerView *)pickerView
            numberOfRowsInComponent:(NSInteger)component

मुझे समझ नहीं आता कि इस पद्धति का प्रत्येक पैरामीटर के लिए एक विधि का नाम क्यों है। क्या मुझे कुछ ऐसा करना चाहिए:

- (NSMutableArray *)getBusStops:(NSString *)busStop
                        forTime:(NSTimeInterval *)timeInterval

जवाबों:


120

ऑब्जेक्टिव-सी में पैरामीटर का नाम नहीं है, इसलिए एक बृहदान्त्र के बाईं ओर सब कुछ विधि नाम का हिस्सा है। उदाहरण के लिए,

getBusStops: forTime:

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

getBusStops: :

लेकिन यह आपको दूसरे पैरामीटर के बारे में ज्यादा नहीं बताता है।


157

आपको प्रत्येक पैरामीटर नाम को ":" पर बहुत कम से कम परिसीमन करना होगा। तकनीकी रूप से नाम वैकल्पिक है, लेकिन इसे पठनीयता के लिए अनुशंसित किया जाता है। तो आप लिख सकते हैं:

- (NSMutableArray*)getBusStops:(NSString*)busStop :(NSSTimeInterval*)timeInterval;

या आपने क्या सुझाव दिया:

- (NSMutableArray*)getBusStops:(NSString*)busStop forTime:(NSSTimeInterval*)timeInterval;

15
+1: उद्देश्य-सी फ़ंक्शन तर्क वास्तव में स्थितीय हैं, नाम नहीं है, इसलिए लेबल वैकल्पिक है और मानव उपभोग के लिए है।
जेरेट हार्डी

निश्चित नहीं है कि हस्ताक्षर में "forTime" को क्यों पसंद किया जाता है, "timeInterval" का उपयोग फ़ंक्शन में 2 पैरामीटर के रूप में किया जा सकता है, है ना?
गैलेक्टिका

@galactica - निश्चित रूप से, नाम वह हो सकता है जो आपके लिए सबसे ज्यादा मायने रखता है। यह उदाहरण स्थिरता के लिए ओपी की शब्दावली का उपयोग करता है।
EM

2
अभी भी निश्चित नहीं है कि इसका forTimeउपयोग किस लिए किया जाता है?
मर्गलूम

71

हाँ; उद्देश्य-सी पद्धति वाक्यविन्यास कुछ कारणों से इस प्रकार है; इनमें से एक यह है कि यह स्पष्ट है कि आप जो पैरामीटर निर्दिष्ट कर रहे हैं वे क्या हैं। उदाहरण के लिए, यदि आप NSMutableArrayएक निश्चित इंडेक्स पर एक ऑब्जेक्ट जोड़ रहे हैं, तो आप इसे विधि का उपयोग करके करेंगे:

- (void)insertObject:(id)anObject atIndex:(NSUInteger)index;

इस पद्धति को कहा जाता है insertObject:atIndex:और यह स्पष्ट है कि एक वस्तु को एक निर्दिष्ट सूचकांक में डाला जा रहा है।

व्यवहार में, एक स्ट्रिंग जोड़कर "हैलो, वर्ल्ड!" एक के सूचकांक 5 पर निम्नानुसार NSMutableArrayबुलाया arrayजाएगा:

NSString *obj = @"Hello, World!";
int index = 5;

[array insertObject:obj atIndex:index];

यह विधि मापदंडों के क्रम के बीच अस्पष्टता को भी कम करता है, यह सुनिश्चित करता है कि आप ऑब्जेक्ट पैरामीटर पहले पास करते हैं, फिर इंडेक्स पैरामीटर। यह उन कार्यों का उपयोग करते समय अधिक उपयोगी हो जाता है जो बड़ी संख्या में तर्कों को लेते हैं, और तर्कों को पारित करने में त्रुटि को कम करते हैं।

इसके अलावा, विधि नामकरण सम्मेलन ऐसा है क्योंकि उद्देश्य-सी ओवरलोडिंग का समर्थन नहीं करता है; हालाँकि, यदि आप एक ऐसी विधि लिखना चाहते हैं जो समान कार्य करती है, लेकिन विभिन्न डेटा-प्रकारों को लेती है, तो इसे पूरा किया जा सकता है; उदाहरण के लिए, NSNumberवर्ग; इसमें कई ऑब्जेक्ट निर्माण विधियाँ शामिल हैं:

  • + (id)numberWithBool:(BOOL)value;
  • + (id)numberWithFloat:(float)value;
  • + (id)numberWithDouble:(double)value;

सी ++ जैसी भाषा में, आप अलग-अलग डेटा प्रकारों को तर्क के रूप में पारित करने की अनुमति देने के लिए बस विधि को अधिभारित करेंगे; हालाँकि, Objective-C में, यह सिंटैक्स फ़ंक्शन के प्रत्येक संस्करण के लिए विधि का नाम बदलकर, एक ही फ़ंक्शन के कई अलग-अलग वेरिएंट को लागू करने की अनुमति देता है।


यदि विधि नाम में पैरामीटर नाम शामिल हैं, तो क्या विधि कॉल (संदेश भेजने) के दौरान पैरामीटर नाम आवश्यक हैं?
नवीन

24

प्रत्येक पैरामीटर से पहले पाठ विधि नाम का हिस्सा है। आपके उदाहरण से, विधि का नाम वास्तव में है

-getBusStops:forTime:

प्रत्येक: एक तर्क का प्रतिनिधित्व करता है। एक विधि कॉल में, विधि नाम विभाजित है: s और तर्क के बाद दिखाई देते हैं: seg

[getBusStops: arg1 forTime: arg2]

3
मुझे लगता है कि आप विधि का नाम जोड़ना भूल गए।
.zgür

11

बनाने की विधि के लिए:

-(void)mymethods:(NSString *)aCont withsecond:(NSString *)a-second {
//method definition...
}

कॉल विधि के लिए:

[mymethods:self.contoCorrente withsecond:self.asecond];

-3
(int) add: (int) numberOne plus: (int) numberTwo ;
(returnType) functionPrimaryName : (returnTypeOfArgumentOne) argumentName functionSecondaryNa

मुझे:

(returnTypeOfSecontArgument) secondArgumentName ;

जैसा कि अन्य भाषाओं में हम सिंटैक्स शून्य का उपयोग करते हैं, add(int one, int second) लेकिन OBJ_cउपर्युक्त में तर्क देने का तरीका अलग है

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.