在我試圖理解我可以做什麼和不能做什麼(Objective-)C中的va_list時,我遇到了這個小小的難題。我希望在NSString
上創建一個類別,以便在某些情況下簡化stringWithFormat:
消息,僅僅爲了它的樂趣。我瞄準的是能夠使用實施這樣的:在傳遞之前可以修改va_list嗎?
[@"My %@ format %@!" formattedWith:@"super", @"rocks"];
希望能與一個字符串說「My super format rocks!
」結束了。我(不正確)方法的實現看起來是這樣的:
- (NSString *)formattedWith:(NSString *)arguments, ...
{
va_list list;
va_start(list, arguments);
NSString *formatted = [[[NSString alloc] initWithFormat:self arguments:list] autorelease];
va_end(list);
return formatted;
}
現在的問題是,一旦va_start()
被調用時,va_list的是「縮短」(由於缺乏一個更好的詞),只包含的其餘參數(在僅有示例@"rocks"
的情況下,加上我不關心的調用對象)。傳遞給initWithFormat:
消息的內容因此呈現錯誤的結果類型。
對問題。有沒有方法修改 va_list之前,我把它傳遞給initWithFormat:
消息,所以我可以以某種方式將第一個參數移回列表?
我不是在尋找一個迭代過程,我通過va_list自己循環,我期望瞭解va_list作爲一個整體的極限。謝謝!
也許這篇博客是有幫助的http://cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.html –