Подтвердить что ты не робот

Как передать переменные аргументы другому методу?

У меня есть googled и узнал, как использовать переменные аргументы. но я хочу передать аргументы переменной другому методу. Я получаю ошибки. как это сделать?

-(void) aMethod:(NSString *) a, ... {
  [self anotherMethod:a]; 
  // i m doing this but getting error. how to pass complete vararg to anotherMethod
}
4b9b3361

Ответ 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__]

Это мое решение.