如何在Objective-C中传递多个参数?


178

我已经阅读了几篇有关Objective-C方法语法的文章,但我想我不理解一个方法的多个名称。

我试图创建一个名为方法getBusStopsNSStringNSTimeInterval参数和返回类型NSMutableArray。这就是我构造方法的方式,但显然在运行时会出错:

- (NSMutableArray *)getBusStops:(NSString *)busStop
                                (NSTimeInterval *)timeInterval;

我看到了另一个带有方法的示例:

-(NSInteger)pickerView:(UIPickerView *)pickerView
            numberOfRowsInComponent:(NSInteger)component

我不明白为什么这个方法每个参数都有一个方法名称。我应该对以下内容执行相同操作:

- (NSMutableArray *)getBusStops:(NSString *)busStop
                        forTime:(NSTimeInterval *)timeInterval

Answers:


120

Objective-C没有命名参数,因此冒号左侧的所有内容都是方法名称的一部分。例如,

getBusStops: forTime:

是方法的名称。该名称已分解,因此可以更具描述性。您可以简单地命名您的方法

getBusStops: :

但这并不能告诉您有关第二个参数的太多信息。


157

您至少需要使用“:”分隔每个参数名称。从技术上讲,该名称是可选的,但出于可读性考虑,建议使用该名称。所以你可以这样写:

- (NSMutableArray*)getBusStops:(NSString*)busStop :(NSSTimeInterval*)timeInterval;

或您的建议:

- (NSMutableArray*)getBusStops:(NSString*)busStop forTime:(NSSTimeInterval*)timeInterval;

15
+1:Objective-C函数参数确实是位置变量,而不是命名变量,因此标签是可选的,供人类使用。
Jarret Hardie

不确定为什么在签名中首选“ forTime”,“ timeInterval”可以用作函数中的第二个参数,对吗?
galactica

@galactica-当然,名称可以是您认为最有意义的名称。本示例使用OP的术语来保持一致性。
EM

2
仍不确定forTime用途是什么?
mrgloom

71

是; 出于多种原因,Objective-C方法的语法是这样的;其中之一是使您清楚指定的参数是什么。例如,如果要将对象添加到NSMutableArray某个索引处,则可以使用的方法:

- (void)insertObject:(id)anObject atIndex:(NSUInteger)index;

这个方法叫做 insertObject:atIndex:,很明显,已在指定索引处插入对象。

在实践中,添加字符串“ Hello,World!”。在索引中的5 NSMutableArray称为array将被称为如下:

NSString *obj = @"Hello, World!";
int index = 5;

[array insertObject:obj atIndex:index];

这也减少了方法参数顺序之间的歧义,确保先传递对象参数,然后传递索引参数。当使用带有大量参数的函数时,这将变得更加有用,并减少了传递参数时的错误。

此外,方法命名约定之所以如此,是因为Objective-C不支持重载。但是,如果您要编写一个执行相同工作但采用不同数据类型的方法,则可以实现此目的;例如NSNumber上课;这有几种对象创建方法,包括:

  • + (id)numberWithBool:(BOOL)value;
  • + (id)numberWithFloat:(float)value;
  • + (id)numberWithDouble:(double)value;

在诸如C ++之类的语言中,您将简单地重载number方法以允许将不同的数据类型作为参数进行传递。但是,在Objective-C中,此语法允许通过更改函数每个变体的方法名称来实现同一函数的多个不同变体。


如果函数名称包含参数名称,在方法调用(消息发送)期间是否需要参数名称?
Naveen '04

24

每个参数之前的文本是方法名称的一部分。从您的示例中,方法的名称实际上是

-getBusStops:forTime:

每个:代表一个参数。在方法调用中,方法名称在:s处拆分,并且参数出现在:seg之后

[getBusStops: arg1 forTime: arg2]

3
我认为您忘记添加方法的名称。
Özgür的

11

创建方法:

-(void)mymethods:(NSString *)aCont withsecond:(NSString *)a-second {
//method definition...
}

用于调用的方法:

[mymethods:self.contoCorrente withsecond:self.asecond];

-3
(int) add: (int) numberOne plus: (int) numberTwo ;
(returnType) functionPrimaryName : (returnTypeOfArgumentOne) argumentName functionSecondaryNa

我:

(returnTypeOfSecontArgument) secondArgumentName ;

与其他语言一样,我们使用以下语法无效,add(int one, int second) 但是OBJ_c如上所述分配参数的方式不同

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.