2011-03-10 74 views
7

陣列熙目標C實現方法,該方法採用的參數

是否有人知道如何實現在目標C的方法,將採取的參數數組作爲參數,諸如:

[NSArray arrayWithObjects:@"A",@"B",nil]; 

的方法聲明這種方法是:

+ (id)arrayWithObjects:(id)firstObj... 

我似乎無法做出這樣的方法我自己。我做了以下內容:

+ (void) doSometing:(id)string manyTimes:(NSInteger)numberOfTimes; 

[SomeClass doSometing:@"A",@"B",nil manyTimes:2]; 

它會給warningtoo許多參數函數 'doSometing:manyTimes:'

謝謝了。

回答

12

省略號(...)是由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]; 
} 
+0

是否還有一種方法可以將省略號作爲參數,然後傳遞給另一個方法? – 2011-03-11 09:45:48

+1

@Mats:您通常會獲得va_list並將其傳遞(因此,例如vprintf或NSString -initWithFormat:arguments :)。你不能只傳遞省略號所描述的任何東西(比如,省略號函數調用另一個),因爲C運行時不需要知道有多少東西在那裏,因此不能複製它。 – Tommy 2011-03-11 12:11:17

+0

你可以給一個代碼示例,將省略號傳遞給第二個objective-c方法嗎? – 2011-03-14 12:17:54

3

多個參數(也稱爲arglist)只能出現在方法聲明的末尾。你doSomething方法會是這個樣子:

+ (void)doNumberOfTimes:(NSInteger)numberOfTimes withStrings:(id)firstArg, ... 
{ 
    va_list args; 
    va_start(args, firstArg); 

    NSString * argString = firstArg; 
    while (argString != nil) 
    { 
     // do something with argString here 

     argString = va_arg(args, NSString *); 
    } 

    va_end(args); 
} 

被稱爲如下:

[SomeClass doNumberOfTimes:2 withStrings:@"A", @"B", nil]; 

參見:How to create variable argument methods in Objective-C