उद्देश्य-सी में विधि सिंटैक्स


176

क्या कोई मेरे लिए इस पद्धति घोषणा सिंटैक्स की व्याख्या कर सकता है? इस फ़ंक्शन में, एक UIPickerView (iPhone पर स्लॉट मशीन UI) की पंक्तियों की संख्या वापस की जा रही है। मेरी समझ से, विधि को ' pickerView' कहा जाता है , और एक NSInteger देता है।

यह एक पॉइंटर में उत्तीर्ण होता है जिसे यूपीकरीव्यू कहा जाता है जिसे ' pickerView' ... सबसे पहले, विधि को पैरामीटर के समान नाम क्यों कहा जाता है?

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

क्या है ’ numberOfRowsInComponent? ऐसा लगता है कि हम जो मान लौटा रहे हैं, उसका वर्णन करना है, लेकिन यह मापदंडों के बीच में है।

- (NSInteger) pickerView:(UIPickerView *)pickerView 
 numberOfRowsInComponent:(NSInteger)component
{
    if (component == kStateComponent)
        return [self.states count];

    return[self.zips count];
}

जवाबों:


358

ऑब्जेक्टिव-सी मेथड्स को सेल्फ डॉक्यूमेंटिंग के लिए तैयार किया गया है, और वे स्मालटाक की समृद्ध परंपरा से उधार लेते हैं।

मैं, समझाने के लिए आप यहाँ क्या कोशिश करता हूँ -(NSInteger) pickerView:(UIPickerView*)pickerView numberOfRowsInComponent:(NSInteger)component

  • - (NSInteger)
    यह पहला भाग इंगित करता है कि यह एक ऑब्जेक्टिव C उदाहरण विधि है जो NSInteger ऑब्जेक्ट लौटाता है। -(पानी का छींटा) इंगित करता है कि यह एक है उदाहरण विधि है, जहां एक +संकेत मिलता है कि यह एक है वर्ग विधि। कोष्ठक में पहला मान विधि का वापसी प्रकार है।

  • pickerView:
    यह भाग संदेश नाम का एक भाग है । पूरा संदेश नाम इस मामले में है pickerView:numberOfRowsInComponent:। ऑब्जेक्टिव-सी रनटाइम इस विधि की जानकारी लेता है और इसे संकेतित रिसीवर को भेजता है। शुद्ध सी में, यह दिखेगा
    NSInteger pickerView(UIPickerView* pickerView, NSInteger component)। हालाँकि, चूंकि यह ऑब्जेक्टिव-सी है, अतिरिक्त जानकारी को संदेश नाम में पैक किया जाता है।

  • (UIPickerView*)pickerView
    यह हिस्सा इनपुट का हिस्सा है । यहाँ इनपुट प्रकार का है UIPickerView*और इसमें पिकर व्यू का स्थानीय परिवर्तनशील नाम है।

  • numberOfRowsInComponent:
    यह भाग संदेश नाम का दूसरा भाग है । जैसा कि आप यहां देख सकते हैं, संदेश नाम को विभाजित करने में मदद करने के लिए संकेत मिलता है कि आप रिसीवर को क्या जानकारी दे रहे हैं। इस प्रकार, अगर मुझे चर foo और बार के साथ एक ऑब्जेक्ट myObject का संदेश देना था, तो मैं टाइप करूंगा:
    [myObject pickerView:foo numberOfRowsInComponent:bar];
    C × ×: के विपरीत
    myObject.pickerView(foo, bar);

  • (NSInteger)component
    यह इनपुट का अंतिम भाग है । यहाँ इनपुट प्रकार का है NSIntegerऔर घटक का एक स्थानीय चर नाम है।


18
एक महान जवाब के लिए +1। मैं आपके पहले बिंदु में "फ़ैक्टरी" को "क्लास" में बदलने का सुझाव दूंगा, क्योंकि "+" आधिकारिक तौर पर एक क्लास पद्धति को इंगित करता है। यह सिर्फ इतना होता है कि कई "+" तरीके कारखाने के तरीके हैं, लेकिन यह उचित परिभाषा नहीं है।
ई। जम्स

2
धन्यवाद! एक अतिरिक्त प्रश्न: यदि आप किसी वस्तु को दर्शाते हैं, जैसे चर foo और बार के साथ myObject जैसा कि आपने दिखाया: [myObject pickerView: foo numberOfRowsInComponent: bar]; पिकर व्यू पद्धति के नाम या पैरामीटर का उल्लेख करता है?
क्रेग

2
न तो। विधि नाम और पैरामीटर दोनों को संदर्भित करने के लिए यह अच्छी शैली है, लेकिन पूर्ण विधि नाम वास्तव में pickerView: numberOfRowsInComponent: है। यदि आप pickerView को लागू करने की कोशिश कर रहे थे: तो आप एक रनटाइम त्रुटि प्राप्त करेंगे, क्योंकि विधि मौजूद नहीं होगी।
लोकेरानी

1
मुझे उस पर स्पष्ट करने दें: पिकर व्यू: स्वयं द्वारा SHOULD भाग अच्छा पैरामीटर कोडिंग शैली का पालन करने के लिए, निम्न पैरामीटर को संदर्भित करता है। हालाँकि, यह विधि नाम का केवल 1/2 है। एक बेहतर उदाहरण हो सकता है [myObject setX: foo Y: bar], जहां विधि setX: Y: है।
लोकेरानी

1
मुझे पता है कि यह उत्तर एक पुराना है, लेकिन मैं पिछले कुछ वर्षों से एक .NET दुनिया में रह रहा हूं। मैं ऑब्जेक्टिव C के लिए नया हूं, और एक वेब दुनिया से मोबाइल उद्योग में संक्रमण कर रहा हूं। मैं इतनी अच्छी तरह से प्रलेखित स्पष्टीकरण के लिए धन्यवाद देना चाहता हूं जो प्रश्न के लिए बहुत प्रासंगिक है। +1
d3v1lman1337

52

ऑब्जेक्टिव-सी में, एक विधि का नाम घोषणा के सभी भागों से बना है जो तर्क और प्रकार नहीं हैं। इस विधि का नाम इसलिए होगा:

pickerView:numberOfRowsInComponent:

विधि एक सी-स्टाइल फ़ंक्शन के बराबर होगी जो निम्नानुसार देखा गया था:

संपादित करें: ( जेरेट हार्डी के साथ धन्यवाद ):

NSInteger pickerViewNumberOfRowsInComponent(UIPickerView * pickerView, NSInteger component)

1
+1 - अच्छा संक्षिप्त विवरण। कभी कभी मैं लाइट बल्ब लोगों के लिए पर चला जाता है, तो आप के रूप में "NSInteger pickerViewNumberOfRowsInCompoent (UIPickerView * pickerView, NSInteger घटक) सी-शैली बराबर बारे में लगता है
Jarret हार्डी

मुझे आपका स्पष्टीकरण पसंद है, सी में फिर से लिखना ज्यादा बेहतर है।
lcc

30

पिछले उत्तरों को जोड़ते हुए, मैं सिर्फ इतना कहना चाहूंगा कि ऑब्जेक्टिव-सी मेथड्स (या यदि आप चाहें तो मैसेजेस) में बाहरी और आंतरिक पैरामीटर नाम हैं।

तो इस मामले में:

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

numberOfRowsInComponentहै बाहरी नाम, एक है कि आप जब बाहर से इस विधि बुला का प्रयोग करेंगे।

और componentहै आंतरिक पैरामीटर, एक आप विधि के अंदर से पैरामीटर का उल्लेख करने के लिए उपयोग का नाम है।

आशा है कि यह थोड़ा ऊपर साफ करता है।


1
आपके विवरण के अनुसार, विधि नाम को पहले पैरामीटर के बाहरी नाम के रूप में माना जा सकता है। यह भी wilczarz की टिप्पणी के साथ फिट बैठता है।
जेक

धिक्कार है, मुझे यह उत्तर गलत लगा। मापदंडों के बाहरी / आंतरिक नाम की तरह कुछ भी नहीं है। इसका प्रकार और विविधता पहचानकर्ता है। मुझे आश्चर्य है कि क्यों हर कोई ओबजेक को एक प्राकृतिक भाषा के रूप में परिभाषित करने के लिए इतनी मेहनत करता है, यह अपने सभी तरीकों से इतना अप्राकृतिक है। इसकी एक भाषा, यह है, बस इसे चारों ओर फैंसी शब्दों का उपयोग किए बिना इसे सीखने की सुविधा देता है।
सिद्धार्थ

तर्क में आंतरिक / बाहरी नाम हो सकते हैं। यह सच है।
lcc

21

यह मुझे लगता है कि उद्देश्य-सी विधि हस्ताक्षर अधिक वाक्यों की तरह हैं। प्रत्येक पैरामीटर विधि के नाम में एक भाग के योग्य है। उदाहरण के लिए, C में व्यक्ति के बारे में कुछ जानकारी सेट करने के लिए हमारे पास एक विधि ( setPersonData ) हो सकती है :

void setPersonData( char* name, int age, float height ) {

और ऑब्जेक्टिव-सी में विधि अधिक वर्णनात्मक होगी ( सेटपर्सननाम: औरएज: -हाईट ), जैसे

- (void) setPersonName: (char *)name andAge:(int)age andHeight:(float)height {

8
और क्यों सेट करेगाPersonalData (char * andName, int alsoAge, float alsoHeight) का कोई मतलब नहीं है? इसके बारे में यह सब कि आप सिंटैक्स के बारे में क्या समझते हैं, यहाँ objc डिजाइनरों के स्मार्ट होने के इरादे के बारे में कुछ भी नहीं है। उन्होंने सिर्फ और अधिक वाक्यविन्यास का एक गुच्छा जोड़ा, जिसका खुलकर कोई मतलब नहीं था .. :)
सिद्धार्थ

5
आप उस जवाब को गलत समझ रहे हैं जिससे मैं डरता हूं। setPersonalData (char * andName, int tooAge, float alsoHeight) एक हस्ताक्षर है, न कि आह्वान। इस समारोह का आह्वान setPersonData ("टॉम", 25, 175) होगा - और यह बहुत कुछ नहीं कहता है? ओबज-सी आह्वान इस तरह दिखेगा: [व्यक्ति सेटपर्सननाम: @ "टॉम" औरआगे: 25 और हाइट: 175];
wilczarz

3
अब जब मैं इसके बारे में सोचता हूं, तो मेरी प्रतिक्रिया एक बयान की तुलना में अधिक शिकायत है। मैं और अधिक सहमत नहीं हो सकता।
सिद्धार्थ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.