Pass variational argument from one method to another using ARC

I am trying to pass a variational argument (NSString *) from one method to another, as in the following example:


- (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);
}

Problems arise when trying to pass arguments. ARC complains about implicit conversion from va_list (char *) to NSString *. I tried everything to make it work.

The same method will work if I pass va_list to [NSString stringWithFormat: ...], so I do not understand why it does not work here.

Any help appreciated.

+5
source share
1 answer

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;
}
+3

All Articles