Как использовать va_args для передачи аргументов (переменные параметры, многоточие) - PullRequest
9 голосов
/ 29 июня 2010

Я не могу разобраться в синтаксисе нескольких аргументов в Objective-C.Я видел этот вопрос , но ответ мне не помог (пока).

Вот мой код (на самом деле я хочу в конечном итоге перейти к NSString stringWithFormat, но получить NSLogдля работы было бы достаточно хорошо на данный момент):

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
     // Insert code here to initialize your application 
     [self log:@"blah blah %d", 32];
}


- (void)log:(NSString *)text, ... {
      va_list args;
      va_start(args, text);
      NSLog(text, args);
}

Аргумент (или некоторый аргумент) получен, но у него есть какое-то странное значение (вывод blah blah 1606412704).Как мне передать значения, которые приходят через ...?

Ответы [ 2 ]

21 голосов
/ 29 июня 2010

Существует вариант NSLog, который принимает va_list с именем NSLogv:

- (void) log:(NSString *)text, ... {
  va_list args;
  va_start(args, text);
  NSLogv(text, args);
  va_end(args);
}

Единственный способ пересылки фактического ... (не va_list) - использовать макрос.Например:

#define MyLog(f, ...) { \
NSLog(f, ##__VA_ARGS__); \
[someObject doSomething:f, ##__VA_ARGS__]; \
}

Однако это следует использовать очень экономно, поскольку макросы могут сделать код действительно запутанным.

12 голосов
/ 29 июня 2010

Вы можете использовать -[NSString initWithFormat:arguments:]:

- (void)log:(NSString *)text, ...
{
    va_list args;
    va_start(args, text);
    NSString *log_msg = [[[NSString alloc] initWithFormat:text arguments:args] autorelease];
    NSLog(@"%@", log_msg);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...