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:]问题?
任何帮助将不胜感激!
正如贾斯汀指出的,有一种更简单的方法可以做到这一点。NSString 有一个 -initWithFormat:arguments: 方法,可以完全满足您的需求。
另外,您的方法名称有一些问题:
鉴于上述所有内容,该方法变得类似于(没有错误检查):
- (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)
| 归档时间: |
|
| 查看次数: |
677 次 |
| 最近记录: |