2011-03-10 64 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