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

iphone ios objective-c variadic-functions

18614 просмотра

4 ответа

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

-(void) aMethod:(NSString *) a, ... {
  [self anotherMethod:a]; 
  // i m doing this but getting error. how to pass complete vararg to anotherMethod
}
Автор: g.revolution Источник Размещён: 12.11.2019 09:37

Ответы (4)


54 плюса

Решение

AFAIK ObjectiveC (так же, как C и C ++) не предоставляет вам синтаксис, который позволяет вам иметь в виду то, что вы имеете в виду.

Обычный обходной путь - создать две версии функции. Тот, который может быть вызван напрямую с помощью ..., а другой вызывается другими функциями, передавая параметры в виде va_list.

..
[obj aMethod: @ "проверить этот параметр% d", 1337);
[obj anotherMethod: @ "проверить параметр% d", 666);
..

- (недействительно) aMetod: (NSString *) a, ... 
{
    va_list ap;
    va_start (ap, a);

    [self anotherMethod: a withParameters: ap]; 

    va_end (ар);
}

- (void) другой метод: (NSString *) a, ...
{
    va_list ap;
    va_start (ap, a);

    [self anotherMethod: a withParameters: ap]; 

    va_end (ар);
}

- (void) anotherMethod: (NSString *) a с параметрами: (va_list) valist 
{
    NSLog ([[[NSString alloc] initWithFormat: arguments: valist] autorelease]);
}
Автор: Till Размещён: 06.03.2010 08:31

20 плюса

Вы не можете передавать переменные аргументы напрямую. Но некоторые из этих методов предоставляют альтернативу, которую вы можете передать 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]);
}
Автор: kennytm Размещён: 06.03.2010 08:31

1 плюс

Рассматривали ли вы настройку аргументов в массиве или словаре и условное кодирование?

-(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];
        }
    }
}
Автор: Justin Размещён: 29.10.2010 05:06

0 плюса

Я думаю, что вы могли бы использовать макросы для достижения того же. Допустим, вы хотите передать аргументы переменной aMethod другому

-(void) aMethod:(NSString *) a, ... {
}

Вы можете определить свой другой «метод», используя макрос, хотя это не настоящий метод:

#define anotherMethod(_a_,...) [self aMethod:_a_,##__VA_ARGS__]

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

Автор: Jidong Chen Размещён: 23.08.2017 08:40
Вопросы из категории :
32x32