如何编写具有多个参数的方法/消息?

时间:2009-07-01 00:22:06

标签: objective-c parameters methods messages

如何编写包含多个参数的方法/消息?

编辑:就像单个方法/消息的多个参数一样,我的意思是。

3 个答案:

答案 0 :(得分:32)

您可以这样写声明:

- (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对象,以及常量布尔值{{ 1}}。

答案 1 :(得分: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),以及每个参数的类型和名称。

关键!与大多数其他语言不同,你不能重载Objective-C中的方法 - 这意味着你不能有两个方法具有相同的选择器但不同的参数数量和/或类型的顺序。例如,您不能使用这两种方法:

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

由于两者的选择器名称都是 initWithObjects:,Objective-C不区分这两者。选择器名称被转换为唯一的整数,以便进行极快的查找,这在动态运行时很有用,但对于期望方法重载的人来说却是一种失望。在像Java这样的语言中重载的最常见情况是构造函数,由于alloc / init模式,这在Objective-C中是非问题的。对于其他方法,选择唯一名称可以避免此问题。

从样式的角度来看,由于参数散布在方法选择器中,因此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];

空格与编译器无关。如果它让您更容易阅读和理解,请务必使用它。

答案 2 :(得分:2)

杰夫准确地描述了这些方法的样子。如果你想看看它看起来像C函数,它看起来像:

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

参数“names”全部连接在一起形成一个方法名称,两个隐藏参数self和_cmd被添加到前面。