Objective-C 2.0中的可选参数

在Objective-C 2.0中,是否可以创build一个参数是可选的方法? 也就是说,你可以有一个像这样的方法调用:

[aFraction print]; 

以及这个:

 [aFraction print: someParameter]; 

在同一个程序中。

苹果公司的Objective-C 2.0编程语言指南将Python与Ob​​j-C做了对比,似乎这是不被允许的。 我还在学习,我想确定。 如果可能,那么语法是什么,因为我的第二个代码示例不起作用。

更新:好的,我只是提出了两个方法,都命名为“打印”。

 -(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]]; } 

编辑:

请不要使用printprint:在同一时间。 首先,它没有指出参数是什么,其次没有人(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: 

它的工作原因是:因为:是方法名称的一部分,所以就编译器而言, printprint:是完全不同的消息,它们与“print”和“sprint”没有更紧密的联系。

但是,您给出的方法的具体名称并不是一个很好的例子,因为从名称不清楚参数是什么(或者“打印”本身意味着参数是什么对象打印)。 比如printFalseMessageprintMessageWithFlag:会更好。

多个可选参数的另一个select是将它们全部传入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]; 

这是从苹果文档直接。 你用表示所有参数的结束。

为了避免parsing问题:“aVariable”用作前一个参数的名称,而不是作为从编译获得的select器的一部分,作为警告,您应该这样做:

 - (void)printWithParameter:(BOOL)sv color:(NSColor *)color{ // your cool code goes here if ( sv ) { NSLog(@"cool stuff turned on"); } else { NSLog(@"cool stuff turned off"); } } 

你可以调用这个方法,例如:

 [self printWithParameter:NO color:[UIColor someColor]] // NO instead of 0 

要么

 [self printWithParameter:YES color:[UIColor someColor]] // YES instead of 1