В моих попытках понять, что я могу и не могу сделать с помощью va_list в (Objective-) C, я натолкнулся на эту маленькую головоломку. Я надеялся создать категорию на NSString
, которая в некоторых случаях немного упростит сообщение stringWithFormat:
, просто для удовольствия. То, к чему я стремился, было в состоянии использовать реализацию как это:
[@"My %@ format %@!" formattedWith:@"super", @"rocks"];
В надежде получить строку с надписью "My super format rocks!
". Моя (неправильная) реализация метода выглядит так:
- (NSString *)formattedWith:(NSString *)arguments, ...
{
va_list list;
va_start(list, arguments);
NSString *formatted = [[[NSString alloc] initWithFormat:self arguments:list] autorelease];
va_end(list);
return formatted;
}
Теперь проблема в том, что как только вызывается va_start()
, va_list «укорачивается» (из-за отсутствия лучшего слова) и содержит только остальные аргументы (в случае примера только @"rocks"
остается, плюс вызывающий объект, который меня не волнует). Поэтому то, что передано в сообщение initWithFormat:
, дает неправильный вид результата.
К вопросу. Есть ли способы изменить va_list, прежде чем я передам его в сообщение initWithFormat:
, чтобы я мог как-то перенести первый аргумент обратно в список?
Я не ищу итеративный процесс, в котором я сам перебираю va_list, я пытаюсь понять пределы va_list в целом. Спасибо!