Ваш метод urlForId:params:parts:
ожидает, что первый аргумент после клавиатуры parts:
будет NSString*
, но вы передаете ему va_list
. Это разные типы. Передача переменной va_list
в качестве параметра функции не раскрывает ее магически во все исходные аргументы. Под прикрытием va_list
- это просто указатель на фрейм стека, и это все, что передается.
То, что вам действительно нужно сделать, - это выделить секцию urlForId:params:parts:
, которая просматривает список деталей, и вызвать этот секционированный раздел непосредственно из specialUrlForId:params:parts:
. Предположительно ваш urlForId:params:parts:
метод выглядит примерно так:
- (NSURL *)urlForId:(NSString *)aId params:(NSDictionary *)aParams parts:(NSString *)aPart, ...
{
va_list ap;
va_start(ap, aPart);
// loop over the variable arguments, starting with aPart, perhaps
// stopping when you find nil.
while (aPart != nil) {
doSomething(aPart);
aPart = va_arg(ap, NSString *);
}
va_end(ap);
return someUrl;
}
То, что вы должны сделать, это переместить деталь после va_start
и до va_end
в метод, который принимает параметр va_list
:
- (NSURL *)urlForId:(NSString *)aId params:(NSDictionary *)aParams arguments:(va_list)ap
{
// loop over the variable arguments, starting with aPart, perhaps
// stopping when you find nil.
while (aPart != nil) {
doSomething(aPart);
aPart = va_arg(ap, NSString *);
}
return someUrl;
}
Затем вы заставляете оба urlForId:params:parts:
и specialUrlForId:params:parts:
вызывать этот новый urlForId:params:arguments:
метод:
- (NSURL *)urlForId:(NSString *)aId params:(NSDictionary *)aParams parts:(NSString *)aPart, ...
{
va_list ap;
va_start(ap, aPart);
NSURL *url = [self urlForId:aId params:aParams arguments:ap];
va_end(ap);
return url;
}
- (NSURL *)specialUrlForId:(NSString *)aId params:(NSDictionary *)aParams parts:(NSString *)aPart, ...
{
va_list ap;
va_start(ap, aPart);
NSURL *url = [self urlForId:aId params:aParams arguments:ap];
va_end(ap);
return url;
}