您如何编写具有多个参数的方法/消息?
编辑:就像单个方法/消息的多个参数一样,我的意思是。
您可以这样编写声明:
- (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
。
在 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];
空格与编译器无关。如果它使您更容易阅读和理解,请务必使用它。
Jeff 准确地描述了这些方法的样子。如果你想看看它看起来像一个 C 函数,它看起来像:
void drawRoundedRect_inView_withColor_fill( MyObject* self, SEL _cmd, NSRect aRect, NSView* aView, NSColor* color, BOOL fill );
参数“names”全部连接在一起形成一个单一的方法名,并在前面添加了两个隐藏参数self和_cmd。