在Objective C中调用具有不同数量参数的函数

时间:2011-03-25 08:37:55

标签: objective-c

是否可以调用未指定所需参数的确切数量的函数?

E.g。 我想打电话:

-(void)genFunction:(NSString *)someID {}

然后再调用它但使用不同数量的参数

-(void)genFunction:(NSString *)someID AndMore:(NSString *)anotherParam {}

我想这样做而不必为每个案例编写多个函数......

最诚挚的问候 Luben

2 个答案:

答案 0 :(得分:3)

您将在标准框架中找到它们。例如NSArray有一个方法:

- (id)initWithObjects:(id)firstObj, ...

...表示该方法采用可变数量的参数。

要编写自己的可变方法,需要使用C的标准可变参数函数,请参阅文档中的stdarg。大纲如下:

+ (void) msgWithFormat:(NSString *)format, ...
{
    va_list args;
    va_start(args, format);
    // use the va_arg() function to access the arguments - see docs for stdarg
    va_end(args);
}

这与C等价物直接相似:

void DebugLog_Msg(const char *format, ...)
{
    va_list args;
    va_start(args, format);
    // use the va_arg() function to access the arguments - see docs for stdarg
    va_end(args);
}

答案 1 :(得分:2)

不,在Objective C参数(或更准确地说,消息)是方法名称的一部分,Genfunction:GenFunction:AndMore:无关,它们是完全不同的方法。

但是你总是可以将常用功能放在一个方法中并从其他方法中调用它。 e.g。

- (void)genMethodByID:(NSString *)newID {
    // Your totally awesome special case.
    [self genMethod];
}

- (void)genMethodByDate:(NSDate *)newDate {
    // Your totally awesome special case.
    [self genMethod];
}

- (void)genMethod {
    // Your totally awesome common code.
}

或者只是在NSDictionary内发送参数。

- (void)genMethodWithParameters:(NSDictionary *)newDictionary {
    NSLog(@"I can haz ID: %@", [newDictionary objectForKey:@"newID"]);
    NSLog(@"I can haz date: %@", [newDictionary objectForKey:@"newDate"]);
}