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)
空格与编译器无关.如果它让您更容易阅读和理解,请务必使用它.
归档时间: |
|
查看次数: |
39634 次 |
最近记录: |