2015-05-05 150 views
0

我有一個可變參數函數運行的第一個參數一些代碼,然後運行NSStringinitWithFormat:arguments:之後,如果參數已經被通過可變參數功能:檢查數量的參數

+ (NSString *)updatedString:(NSString *)mainString, ... 
{ 
    // Some code run on mainString here, outputs finalString 

    // add format arguments to the final string 
    va_list args; 
    va_start(args, mainString); 
    NSString *formattedString = [[NSString alloc] initWithFormat:finalString arguments:args]; 
    va_end(args); 

    return formattedString; 
} 

編輯:的想法在mainString上運行的代碼使用正則表達式來查找和替換文本中的變量。所以說輸出(finalString)等於"Hello World %@ blah blah %@",那麼它將使用參數來替換%@符號。問題是我不知道解析的字符串是否包含%@符號,直到字符串解析。

所以,我需要檢查是否實際上有任何額外的參數,如果沒有,我不想運行initiWithFormat部分。

有什麼辦法可以檢查args是否先存在?

+2

爲什麼你需要檢查?只要格式字符串沒有格式說明符,即使沒有更多參數,也可以調用'initWithFormat'。 – rmaddy

+0

是否有一個原因,你不能修改updatedString方法,所以你可以顯式傳遞可變參數的數量? – ericg

+0

請解釋你正在努力達到的目標。因爲現在你的代碼看起來完全錯了。可能通過NSArray參數傳遞參數將更適合你。 –

回答

3

不。在C/Objective-C中,一個被稱爲可變參數的函數完全不知道調用者傳遞的參數的數量和類型。它必須基於其他信息(例如格式參數,它們與格式字符串中的格式說明符相匹配;或者用於初始化Cocoa集合的對象,列表以nil終止)並且相信調用方正確遵循慣例。

+0

好的,我明白了。我試圖「變聰明」,並將函數格式化爲與'initWithFormat'相同的方式,但我可以輕鬆地傳遞一組參數。看起來,我將不得不採取這種做法。謝謝! – jowie