2009-09-14 86 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

相關問題