2009-07-01 82 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 2009-07-01 00:25:26

+1

沒有。該調用包含在一組[]中,因此它必須是單一方法。這是具有4個參數的單一方法。 – 2009-07-01 00:30:23

2

Jeff準確地描述了這些方法的樣子。如果你想看看它是什麼樣子的C函數,它看起來是這樣的:

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

參數「名稱」的所有聯合起來,形成一個單一的方法名和兩個隱藏參數,自我和_cmd被添加到前面。

14

在Objective-C中,方法名稱被正確地稱爲「選擇器」,並且可以由一個或多個部分組成。如果該方法接受一個或多個參數,所述選擇器的每個部分的形式是:

selectorFragmentName:(ParameterType)parameterName 

例如,你會看到方法聲明這樣一個從NSColor:

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

在這種情況下,方法(選擇器)名稱是colorWithDeviceRed:green:blue:alpha: - 其餘的表示範圍( - 例如方法,+爲類),返回類型(NSColor * here)以及每個類型和名稱參數。

CRITICAL!與大多數其他語言不同,您不能在Objective-C中重載方法 - 這意味着您不能使用兩個具有相同選擇器但具有不同參數和/或類型順序的方法。例如,你不能有這兩種方法:

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

由於兩種選擇的名字是initWithObjects:的Objective-C不區分兩者。選擇器名稱被轉換爲唯一的整數以便進行極快的查找,這對動態運行時非常有用,但對於希望方法重載的用戶來說卻是一種失望。在像Java這樣的語言中重載的最常見情況是構造函數,這是Objective-C中的一個非問題,因爲alloc/init模式。對於其他方法,選擇獨特的名稱可以避免這個問題。

從風格的角度來看,由於參數在方法選擇器散佈,Objective-C的編程(和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]; 

的空白是無關的編譯器。如果它讓你更容易閱讀和理解,絕對可以使用它。

相關問題