#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. ну, да, это был бы самый простой способ 😉 Но поскольку я в теме, я действительно хочу попробовать трудный путь.