В своих попытках понять, что я могу и чего не могу делать с va_list в (Objective-) C, я наткнулся на эту небольшую загадку. Я надеялся создать категорию на NSString
, которая в некоторых случаях немного упростила бы сообщение stringWithFormat:
, просто для удовольствия. Я стремился к тому, чтобы иметь возможность использовать такую реализацию:
[@"My %@ format %@!" formattedWith:@"super", @"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 в целом.Спасибо!