1

我的函数接受一个字典参数和一个可变数量的NSString变量。所有这些组合都放在一个[NSString stringWithFormat:]方法中,并以NSURLRequest. 该方法如下所示:

- (NSURLRequest *)buildPath:(NSString *)stringPath attributes:(NSString *)attribute, ...
{
    va_list list;
    NSString *eachObject;
    NSMutableArray *args = [NSMutableArray array];

    [args addObject:attribute];
    va_start(list, attribute);
    while ((eachObject = va_arg(list, NSString *))) {
        [args addObject:eachObject];
    }
    va_end(list);

    NSString *listOfAttributes = [args componentsJoinedByString:@", "];
    NSString *pathURL = _requestString[stringPath];
    NSString *path = [NSString stringWithFormat:pathURL, listOfAttributes];

    NSURL *url = [NSURL URLWithString:path];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    return request;
}

这是我调用该方法时的样子:

NSURLRequest *request = [_venueService buildPath:@"categories"
                                          attributes:_venueService.clientID, _venueService.clientSecret, _venueService.todaysDate, nil];

当我运行程序时,它崩溃了。当我注销时,listOfAttributes它给了我:

client_id, client_secret, 20140507

这是我的 3 个参数,这是正确的,并且stringPath(当我在我编写的程序中实际调用它时stringPath[@"categories"])当我 NSLog 给我时:

https://api.foursquare.com/v2/venues/categories?client_id=%@&client_secret=%@&v=%@

所以,我的问题是,为什么这两个字符串会结合在一起[NSString stringWithFormat:]导致问题?

任何帮助将不胜感激!

4

3 回答 3

4

正如贾斯汀指出的那样,有一种更简单的方法可以做到这一点。NSString 有一个 -initWithFormat:arguments: 方法,它完全符合您的要求。

此外,您的方法名称有一些问题:

  1. 命名约定 - 您应该在方法名称中指明其用途(创建 URL 请求)
  2. 您正在为路径传递 (NSDictionary *),但在使用它时将其转换为 (NSString *)。这两个对象类型不兼容。我想这可能是您复制粘贴代码时的拼写错误?
  3. 不妨使用与 NSString 的 +stringWithFormat: 方法相同的调用约定。

鉴于以上所有情况,该方法变为(没有错误检查):

- (NSURLRequest  *)URLRequestWithFormat:(NSString *)format, ... {
    va_list arguments;
    va_start(arguments, format);
    NSString *urlPath = [[NSString alloc] initWithFormat:format arguments:arguments];
    va_end(arguments);
    NSURL *url = [NSURL URLWithString:urlPath];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    return request;
}

这适用于如下调用:

NSURLRequest *request = [self URLRequestWithFormat:@"https://api.foursquare.com/v2/venues/categories/client_id=%@&client_secret=%@&v=%@", @"One",@"Two",@"Three"];
NSLog(@"Request: %@", request);

带输出:

2014-05-07 09:52:30.645 Test[5888:60b] Request: <NSURLRequest: 0x8c64f30> { URL: https://api.foursquare.com/v2/venues/categories/client_id=One&client_secret=Two&v=Three }
于 2014-05-06T22:52:50.870 回答
2

您可能需要阅读-[NSString initWithFormat:arguments:]. 该方法接受一个va_list参数,并且可能会执行您想要的操作。

您的示例代码不起作用的原因是因为stringWithFormat格式字符串中出现的每个占位符都需要一个单独的参数。您的格式字符串看起来包含三个%@占位符,但您只传递了一个参数listOfAttributes.

于 2014-05-06T22:31:51.880 回答
1

stringPath 中的格式指定应该有 3 个参数,但您只提供一个 - listOfAttributes。

listOfAttributes 是一个参数而不是 3。

于 2014-05-06T22:31:17.620 回答