2009-09-14 51 views
29

我想在Objective-C中编写一个函数,例如下面的函数,它接受可变数量的参数,并将这些参数传递给+stringWithFormat:。我知道vsnprintf,但这意味着将NSString的'格式'转换为C并返回(并且也意味着转换其中的格式化占位符以及...)。下面如何将可变数量的参数“传递”到NSString的+ stringWithFormat:

代码编译,但当然不表现为我想:)

NSString *estr(NSString *format, ...) { 
    va_list args; 
    va_start(args, format); 
    NSString *s = [NSString stringWithFormat:format, args]; 
    va_end(args); 
    return s; 
} 

基本上:是那里的+stringWithFormat:方法的va_list - 友好的版本,或者是有可能写一个?

+0

只是为了证明这不仅仅是一个玩具的例子,我很乐意在这里也使用这种方法:http://cocoaheads.byu.edu/wiki/different-nslog – 2009-09-14 22:52:34

+1

是的! NSLog过于健谈,有时难以阅读。我想到的是一种非常简单的国际化我的应用程序的方式...我想写一些类似tr(@“无法打开文件%@”,filePath);例如,并且在开发的早期阶段将其简单地返回(正确格式化),然后再有一个工具可以找到所有的tr()调用,从它找到的调用中为翻译创建所需的资源文件,那么稍后我只需要翻开一个开关,而tr()调用实际上会查找并翻译它们传递的消息...... – 2009-09-19 19:10:09

回答

46

initWithFormat:arguments:

NSString *estr(NSString *format, ...) { 
    va_list args; 
    va_start(args, format); 
    NSString *s = [[[NSString alloc] initWithFormat:format arguments:args] autorelease]; 
    va_end(args); 
    return s; 
} 

他们似乎并不有一个便捷构造“stringWith ......”版本

+0

的确如此!非常感谢你,我正在看错地方(加上,我忘记了'autorelease'的电话)。这工作! – 2009-09-14 09:14:22

+5

你是对的,他们没有相当的便利方法。几个月前我提出了一个雷达(#7025084)请求这个确切的事情。如果你想要这个功能,请报告一个错误,要求'+ [NSString stringWithFormat:arguments:]'并且引用这个雷达号码 - 重复(已经有一个)是最好的开发者在他们认为是“投票”时可以做的事情重要。 http://bugreport.apple.com – 2009-09-14 14:24:26

+1

注意:为了简化分类,如果您提交重复的错误,请使用组件名称“NSString”和版本“X”。谢谢! – 2009-09-14 22:45:06

相关问题