16

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

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

4

3 回答 3

33

您可以这样编写声明:

- (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从嵌套方法调用获得的对象,以及常量 boolean value YES

于 2009-07-01T00:23:43.327 回答
15

在 Objective-C 中,方法名称被恰当地称为“选择器”,并且可以由一个或多个部分组成。如果该方法接受一个或多个参数,则选择器的每一部分都采用以下形式:

selectorFragmentName:(ParameterType)parameterName

例如,你会在 NSColor 中看到类似这样的方法声明:

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

在这种情况下,方法(选择器)名称是colorWithDeviceRed:green:blue:alpha: — 其余部分表示范围(- 例如实例方法,+ 表示类)、返回类型(此处为 NSColor*)以及类型和名称每个参数。

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

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

由于两者的选择器名称都是initWithObjects: Objective-C 不区分两者。选择器名称被翻译成唯一的整数以实现极快的查找,这在动态运行时是有益的,但对于那些期望方法重载的人来说是一个失望。在像 Java 这样的语言中,最常见的重载情况是构造函数,由于分配/初始化模式,这在 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];

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

于 2009-07-01T05:00:37.267 回答
2

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

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

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

于 2009-07-01T02:25:39.430 回答