基于可变数量的参数构建 NSString

Nil*_*ne- 2 objective-c variadic-functions nsstring stringwithformat ios

我的函数采用字典参数和可变数量的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;
}
Run Code Online (Sandbox Code Playgroud)

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

NSURLRequest *request = [_venueService buildPath:@"categories"
                                          attributes:_venueService.clientID, _venueService.clientSecret, _venueService.todaysDate, nil];
Run Code Online (Sandbox Code Playgroud)

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

client_id, client_secret, 20140507
Run Code Online (Sandbox Code Playgroud)

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

https://api.foursquare.com/v2/venues/categories?client_id=%@&client_secret=%@&v=%@
Run Code Online (Sandbox Code Playgroud)

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

任何帮助将不胜感激!

Gab*_*iel 5

正如贾斯汀指出的,有一种更简单的方法可以做到这一点。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;
}
Run Code Online (Sandbox Code Playgroud)

这对于以下调用效果很好:

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

带输出:

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 }
Run Code Online (Sandbox Code Playgroud)