如何编写包含多个参数的方法/消息?
编辑:就像单个方法/消息的多个参数一样,我的意思是。
答案 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被添加到前面。