2009-07-01 11 views

उत्तर

29

आप इस तरह के रूप में घोषणा लिख ​​सकते हैं:

- (void) drawRoundedRect:(NSRect)aRect inView:(NSView *)aView withColor:(NSColor *)color fill:(BOOL)fill 

बाद कॉल (4 मानकों के साथ) की तरह लग सकता है:

[self drawRoundedRect:rect inView:self withColor:[NSColor greenColor] fill:YES]; 

जहां rect एक पहले से NSRect परिभाषित किया गया है, self NSView है विधि को एक नेस्टेड विधि कॉल से प्राप्त NSColor ऑब्जेक्ट से जोड़ा जाता है, और निरंतर बूलियन मान YES

+0

यह कई विधियां हैं, नहीं? – Devoted

+1

नहीं। कॉल [] के एक सेट में संलग्न है, इसलिए यह एक ही विधि होनी चाहिए। यह 4 पैरामीटर के साथ एक ही विधि है। –

2

जेफ ने सटीक रूप से वर्णन किया कि विधियां कैसी दिखती हैं। आप इसे एक सी समारोह के रूप में दिखाई देंगे देखने के लिए चाहते हैं, यह कुछ ऐसा दिखाई देगा:

void drawRoundedRect_inView_withColor_fill(MyObject* self, SEL _cmd, NSRect aRect, NSView* aView, NSColor* color, BOOL fill); 

पैरामीटर "नाम" सभी को एक साथ शामिल होने के लिए एक एकल विधि नाम के रूप में, और दो छिपा पैरामीटर, स्वयं और _cmd सामने में जोड़ा जाता है।

14

उद्देश्य-सी में, विधि नामों को "चयनकर्ता" कहा जाता है, और एक या अधिक भागों से बना जा सकता है।

+ (NSColor*) colorWithDeviceRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha; 

इस मामले में:

selectorFragmentName:(ParameterType)parameterName 

उदाहरण के लिए, आप NSColor से इस तरह विधि घोषणाओं देखेंगे: विधि एक या अधिक पैरामीटर स्वीकार करता है, तो चयनकर्ता के प्रत्येक भाग के रूप में है , विधि (चयनकर्ता) नाम colorWithDeviceRed: हरा: नीला: अल्फा: - शेष दायरे को इंगित करता है (- उदाहरण के लिए, कक्षा के लिए +), वापसी प्रकार (एनएससीओलर * यहां), और प्रत्येक के लिए प्रकार और नाम पैरामीटर।

क्रिटिकल! अधिकांश अन्य भाषाओं के विपरीत, आप उद्देश्य-सी में विधियों को अधिभारित नहीं कर सकते हैं - इसका मतलब है कि आपके पास एक ही चयनकर्ता के साथ दो विधियां नहीं हो सकती हैं लेकिन विभिन्न पैरामीटर और/या प्रकारों के क्रम में। उदाहरण के लिए, आप इन दोनों तरीकों की जरूरत नहीं कर सकते हैं:

- (id) initWithObjects:(NSArray*)anArray; 
- (id) initWithObjects:(NSSet*)aSet; 

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

एक शैली दृष्टिकोण से, क्योंकि पैरामीटर पद्धति चयनकर्ता में बीच-बीच में कर रहे हैं, ऑब्जेक्टिव-सी प्रोग्रामर (और Xcode) अक्सर दोनों के लिए घोषणा/परिभाषा, पठनीयता के लिए पेट के पर लंबी चयनकर्ताओं के कुछ हिस्सों संरेखित होगा:

+ (NSColor*) colorWithDeviceRed:(CGFloat)red 
          green:(CGFloat)green 
          blue:(CGFloat)blue 
          alpha:(CGFloat)alpha; 

और मंगलाचरण:

NSColor* myColor = [NSColor colorWithDeviceRed:0.5 
             green:0.6 
              blue:0.7 
             alpha:0.9]; 

खाली स्थान के संकलक के लिए अप्रासंगिक है। यदि यह आपके लिए पढ़ने और समझने में आसान बनाता है, तो निश्चित रूप से इसका उपयोग करें।

+0

जवा के साथ तुलना के साथ ऑब्जेक्ट-सी अवधारणा की व्याख्या भी मुझे समझने में मददगार है। महान पद! – wao813

संबंधित मुद्दे