Как я могу обработать несколько параметров в таком методе, как NSLog?

#objective-c

#objective-c

Вопрос:

Об этом спрашивали раньше, но я не могу разобраться в этом. У меня есть мой собственный экранный регистратор, и в нем есть метод «append», который должен работать почти так же, как NSLog, принимая несколько параметров.

Итак, вместо того, чтобы писать это :

 int mynum = 19;
NSLog(@"This is a number %d",mynum);
  

Я хочу сделать это :

 [Logger append:@"This is a number %d",mynum];
  

Есть идеи, как я мог бы это сделать?

Спасибо

Ответ №1:

Хорошо, вот трудный способ. 🙂

Используйте макросы stdarg.h для создания копии va_list ваших дополнительных аргументов, затем создайте строку с этим, используя -initWithFormat:arguments: метод:

 -(void) append:(NSString*)format, ... {
    va_list args, args_copy;
    va_start(args, format);
    va_copy(args_copy, args);
    va_end(args);

    NSString *logString = [[NSString alloc] initWithFormat:format
                                                 arguments:args_copy];
    // Append logString to your logger

    va_end(args_copy);
    [logString release];
}
  

Этот способ предоставляет вам всю гибкость самого NSLog (), поддерживая любое количество и тип аргументов.

Ответ №2:

Вы хотите многоточие, например

 -(SomeResult*)append:(id)object,... {
  id obj;
  va_list argumentList;
  va_start(argumentList, obj); 
  while (obj = va_arg(argumentList, id)) // Do something with obj
  va_end(argumentList);
  // ...
}
  

Комментарии:

1. Обратите внимание, если вы просто хотите вести журнал, как вы сказали, решение @ Terente лучше

2. Близко, но не совсем. 🙂 Макросы Stdarg — это способ сделать это, но ваш пример поддерживает только аргументы объекта и требует нулевого значения в конце списка аргументов, а не использования строки формата. Вы также не совсем правильно используете va_start() — так и должно быть va_start(argumentList, object) .

3. @Sherm, хорошая мысль, в свою защиту я просто представил введение в использование переменных функций и, конечно, не собирался создавать какой-то функциональный код. ( 1, хотя за указание на это)

Ответ №3:

 [Logger append:[NSString stringWithFormat:@"This is a number %d",mynum]];
  

Комментарии:

1. ну, да, это был бы самый простой способ 😉 Но поскольку я в теме, я действительно хочу попробовать трудный путь.