Как передать переменные аргументы другому методу?
У меня есть googled и узнал, как использовать переменные аргументы. но я хочу передать аргументы переменной другому методу. Я получаю ошибки. как это сделать?
-(void) aMethod:(NSString *) a, ... {
[self anotherMethod:a];
// i m doing this but getting error. how to pass complete vararg to anotherMethod
}
Ответы
Ответ 1
AFAIK ObjectiveC (как и C и С++) не предоставляет вам синтаксис, который позволяет вам непосредственно иметь в виду.
Обычным обходным решением является создание двух версий функции. Тот, который может быть вызван непосредственно с использованием... и другой, вызываемый другими функциями, передающими параметры в форме va_list.
..
[obj aMethod:@"test this %d parameter", 1337);
[obj anotherMethod:@"test that %d parameter", 666);
..
-(void) aMethod:(NSString *)a, ...
{
va_list ap;
va_start(ap, a);
[self anotherMethod:a withParameters:ap];
va_end(ap);
}
-(void) anotherMethod:(NSString *)a, ...
{
va_list ap;
va_start(ap, a);
[self anotherMethod:a withParameters:ap];
va_end(ap);
}
-(void) anotherMethod:(NSString *)a withParameters:(va_list)valist
{
NSLog([[[NSString alloc] initWithFormat:a arguments:valist] autorelease]);
}
Ответ 2
Вы не можете передавать переменные аргументы напрямую. Но некоторые из этих методов предоставляют альтернативу, что вы можете передать аргумент va_list
, например.
#include <stdarg.h>
-(void)printFormat:(NSString*)format, ... {
// Won't work:
// NSString* str = [NSString stringWithFormat:format];
va_list vl;
va_start(vl, format);
NSString* str = [[[NSString alloc] initWithFormat:format arguments:vl] autorelease];
va_end(vl);
printf("%s", [str UTF8String]);
}
Ответ 3
Рассматривали ли вы настройку своих аргументов в массиве или словаре и условно?
-(void) aMethodWithArguments:(NSArray *)arguments {
for (id *object in arguments) {
if ([object isKindOfClass:fooClass]) {
//handler for objects that are foo
[self anotherMethod:object];
}
if ([object isKindOfClass:barClass]) {
//and so on...
[self yetAnotherMethod:object];
}
}
}
Ответ 4
Я думаю, вы могли бы использовать макросы для достижения того же.
Скажем, вы хотите передать аргументы переменной aMethod другому
-(void) aMethod:(NSString *) a, ... {
}
Вы можете определить свой "метод" с помощью макроса, хотя он не является реальным методом:
#define anotherMethod(_a_,...) [self aMethod:_a_,##__VA_ARGS__]
Это мое решение.