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

Dev*_*ted 16 parameters methods objective-c messages

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

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

Jef*_*man 33

您可以这样写下声明:

- (void) drawRoundedRect:(NSRect)aRect inView:(NSView *)aView withColor:(NSColor *)color fill:(BOOL)fill
Run Code Online (Sandbox Code Playgroud)

后续调用(带有4个参数)可能如下所示:

[self drawRoundedRect:rect inView:self withColor:[NSColor greenColor] fill:YES];
Run Code Online (Sandbox Code Playgroud)

其中rect是先前定义的NSRect,self是从该方法调用的NSView,NSColor从嵌套方法调用获得的对象,以及常量布尔值YES.


Qui*_*lor 14

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

selectorFragmentName:(ParameterType)parameterName
Run Code Online (Sandbox Code Playgroud)

例如,您将看到来自NSColor的方法声明,例如:

+ (NSColor*) colorWithDeviceRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha;
Run Code Online (Sandbox Code Playgroud)

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

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

- (id) initWithObjects:(NSArray*)anArray;
- (id) initWithObjects:(NSSet*)aSet;
Run Code Online (Sandbox Code Playgroud)

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

从样式的角度来看,由于参数散布在方法选择器中,因此Objective-C程序员(和Xcode)通常会在冒号处对齐长选择器的各个部分以便于读取,这两者都用于声明/定义:

+ (NSColor*) colorWithDeviceRed:(CGFloat)red
                          green:(CGFloat)green
                           blue:(CGFloat)blue
                          alpha:(CGFloat)alpha;
Run Code Online (Sandbox Code Playgroud)

和调用:

NSColor* myColor = [NSColor colorWithDeviceRed:0.5
                                         green:0.6
                                          blue:0.7
                                         alpha:0.9];
Run Code Online (Sandbox Code Playgroud)

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