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

时间:2009-04-06 18:41:37

标签: objective-c syntax parameters methods

我已经阅读了几篇关于Objective-C方法语法的帖子,但我想我不理解方法的多个名称。

我正在尝试创建一个名为getBusStops的方法,其中NSStringNSTimeInterval参数以及返回类型NSMutableArray。这就是我构建方法的方法,但它在运行时显然会出错:

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

我看了一个方法的另一个例子:

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

我不明白为什么这个方法有每个参数的方法名称。我应该做同样的事情:

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

6 个答案:

答案 0 :(得分:151)

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

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

或你的建议:

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

答案 1 :(得分:109)

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

getBusStops: forTime:

是方法的名称。该名称被拆分,因此它可以更具描述性。你可以简单地命名你的方法

getBusStops: :

但这并没有告诉你第二个参数。

答案 2 :(得分:64)

是; Objective-C方法的语法是这样的,原因有两个:其中一个是明确你指定的参数是什么。例如,如果要在某个索引处向NSMutableArray添加对象,则可以使用以下方法执行此操作:

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

此方法称为insertObject:atIndex:,很明显在指定的索引处插入了一个对象。

实际上,添加一个字符串“Hello,World!”在名为NSMutableArray的{​​{1}}的索引5处将被调用如下:

array

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

此外,方法命名约定是这样的,因为Objective-C不支持重载;但是,如果您想编写一个执行相同工作但采用不同数据类型的方法,则可以完成此操作;以NSString *obj = @"Hello, World!"; int index = 5; [array insertObject:obj atIndex:index]; 类为例;这有几种对象创建方法,包括:

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

在诸如C ++之类的语言中,您只需重载数字方法,以允许将不同的数据类型作为参数传递;但是,在Objective-C中,通过更改函数的每个变体的方法名称,此语法允许实现相同函数的几个不同变体。

答案 3 :(得分:23)

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

-getBusStops:forTime:

每个:代表一个论点。在方法调用中,方法名称在:s处拆分,参数在:s之后显示。 e.g。

[getBusStops: arg1 forTime: arg2]

答案 4 :(得分:6)

for create method:

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

用于调用方法:

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

答案 5 :(得分:-3)

(int) add: (int) numberOne plus: (int) numberTwo ;
(returnType) functionPrimaryName : (returnTypeOfArgumentOne) argumentName functionSecondaryNa
我是:

(returnTypeOfSecontArgument) secondArgumentName ;

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