省略號(...)是由C繼承;你只能將它用作通話中的最後一個參數(並且在你的例子中你錯過了相關的逗號)。所以你的情況,你一定希望:
+ (void)doSomethingToObjects:(id)firstObject, ...;
或者,如果你想計數是明確的,能想到的措辭很好的一種方式:
+ (void)doManyTimes:(NSInteger)numberOfTimes somethingToObjects:(id)firstObject, ...;
然後,您可以使用用於處理橢圓的正常C方法,駐留在stdarg.h中。還有那些here的快速文檔,例如用法是:
+ (void)doSomethingToObjects:(id)firstObject, ...
{
id object;
va_list argumentList;
va_start(argumentList, firstObject);
object = firstObject;
while(1)
{
if(!object) break; // we're using 'nil' as a list terminator
[self doSomethingToObject:object];
object = va_arg(argumentList, id);
}
va_end(argumentList);
}
編輯:添加,響應意見。你不能通過省略號將傳遞給你的各種東西傳遞給另一個函數,因爲C處理函數調用的方式需要省略號(這是Objective-C繼承的,儘管不是那麼明顯)。相反,你傾向於通過va_list。例如。
+ (NSString *)doThis:(SEL)selector makeStringOfThat:(NSString *)format, ...
{
// do this
[self performSelector:selector];
// make string of that...
// get the argument list
va_list argumentList;
va_start(argumentList, format);
// pass it verbatim to a suitable method provided by NSString
NSString *string = [[NSString alloc] initWithFormat:format arguments:argumentList];
// clean up
va_end(argumentList);
// and return, as per the synthetic example
return [string autorelease];
}
是否還有一種方法可以將省略號作爲參數,然後傳遞給另一個方法? – 2011-03-11 09:45:48
@Mats:您通常會獲得va_list並將其傳遞(因此,例如vprintf或NSString -initWithFormat:arguments :)。你不能只傳遞省略號所描述的任何東西(比如,省略號函數調用另一個),因爲C運行時不需要知道有多少東西在那裏,因此不能複製它。 – Tommy 2011-03-11 12:11:17
你可以給一個代碼示例,將省略號傳遞給第二個objective-c方法嗎? – 2011-03-14 12:17:54