Передайте переменный аргумент из одного метода в другой с помощью ARC - PullRequest
5 голосов
/ 14 декабря 2011

Я пытаюсь передать переменный аргумент (NSString *) из одного метода в другой метод, как показано в следующем примере:


- (NSURL *)urlForId:(NSString *)aId params:(NSDictionary *)aParams parts:(NSString *)aPart, ... {
    // ... do something with parts
}

- (NSURL *)specialUrlForId:(NSString *)aId params:(NSDictionary *)aParams parts:(NSString *)aPart, ... {
    va_list arg;
    va_start(args, aPart);
    [self urlForId:aId params:aParam parts:args];
    va_end(args);
}

Проблемы начинаются при попытке передать аргументы.ARC жалуется на неявное преобразование из va_list (char *) в NSString *.Я перепробовал все, чтобы это заработало.

Этот же метод будет работать, если я передам va_list в [NSString stringWithFormat: ...], поэтому я не понимаю, почему он здесь не работает.

Любая помощь приветствуется.

1 Ответ

3 голосов
/ 14 декабря 2011

Ваш метод 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...