在Objective-C 2.0中,是否可以创建一个参数是可选的方法?也就是说,您可以进行如下方法调用:
[aFraction print];
以及:
[aFraction print: someParameter];
在同一个程序中.
Apple的Objective-C 2.0编程语言指南将Obj-C与Python进行了对比,似乎说这是不允许的.我还在学习,我想确定.如果它是可能的,那么什么是语法,因为我的第二个代码示例不起作用.
更新: 好的,我刚刚制作了两个方法,都命名为"print".
头
-(void) print; -(void) print: (BOOL) someSetting;
履行
-(void) print { [self print:0]; } -(void) print: (BOOL) someSetting { BOOL sv; sv = someSetting; if ( sv ) { NSLog(@"cool stuff turned on"); } else { NSLog(@"cool stuff turned off"); } }
相关的计划行
... printParamFlag = TRUE; // no parameter [aCodeHolder print]; // single parameter [aCodeHolder print:printParamFlag]; ...
我无法相信这有效.我有什么理由不这样做吗?
您可以声明多个方法:
- (void)print; - (void)printWithParameter:(id)parameter; - (void)printWithParameter:(id)parameter andColor:(NSColor *)color;
在实现中,您可以这样做:
- (void)print { [self printWithParameter:nil]; } - (void)printWithParameter:(id)parameter { [self printWithParameter:nil andColor:[NSColor blackColor]]; }
编辑:
请不要使用print
,并print:
在同一时间.首先,它不指示参数是什么,其次没有人(ab)以这种方式使用Objective-C.大多数框架都有非常清晰的方法名称,这是使Objective-C无法编程的一件事.普通开发人员不期望这种方法.
有更好的名字,例如:
- (void)printUsingBold:(BOOL)bold; - (void)printHavingAllThatCoolStuffTurnedOn:(BOOL)coolStuff;
你这样做是在Objective-C中做到这一点的正确方法.它在Cocoa中广泛使用.例如,一些NSString的初始值设定项:
– initWithFormat: – initWithFormat:arguments: – initWithFormat:locale: – initWithFormat:locale:arguments:
它起作用的原因是因为它:
是方法名称的一部分,因此就编译器而言,print
并且print:
是完全不同的消息,它们与"print"和"sprint"没有更紧密的联系.
但是,您提供的方法的特定名称对于此并不是一个非常好的情况,因为从名称中不清楚参数是什么(或者"打印"本身意味着参数是对象打印的内容).拥有,比方说,printFalseMessage
和更好printMessageWithFlag:
.
多个可选参数的另一个选项是在NSDictionary中传递它们:
- (void)someMethodWithOptions:(NSDictionary *)options;
然后声明选项字典可能包含:
- key1, value must be a BlahObject - key2, value must be a NonBlahObject
然后你可以允许任何键缺席,甚至字典本身也可以是零.
稍微相关的你可以有可选的参数.这意味着如果您愿意,可以使用任意数量的参数调用方法.但这是C(varargs)的一个特征.
一个例子是NSArray消息:
+ (id)arrayWithObjects:(id)firstObj, ...
用法示例:
NSArray *myArray; NSDate *aDate = [NSDate distantFuture]; NSValue *aValue = [NSNumber numberWithInt:5]; NSString *aString = @"a string"; myArray = [NSArray arrayWithObjects:aDate, aValue, aString, nil];
这直接来自Apple文档.用nil表示所有参数的结束.