Objective c实现了一个带参数数组的方法

Mat*_*art 7 arrays methods objective-c

有没有人知道如何在目标c中实现一个方法,该方法将参数数组作为参数,例如:

[NSArray arrayWithObjects:@"A",@"B",nil];
Run Code Online (Sandbox Code Playgroud)

此方法的方法声明是:

+ (id)arrayWithObjects:(id)firstObj...
Run Code Online (Sandbox Code Playgroud)

我似乎无法自己制作这样的方法.我做了以下事情:

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

[SomeClass doSometing:@"A",@"B",nil manyTimes:2];
Run Code Online (Sandbox Code Playgroud)

它将为警告提供许多参数来实现'doSometing:manyTimes:'

谢谢.

Tom*_*mmy 12

省略号(...)继承自C; 你只能将它用作调用中的最后一个参数(并且你错过了你的例子中的相关逗号).所以在你的情况下你可能想要:

+ (void)doSomethingToObjects:(id)firstObject, ...;
Run Code Online (Sandbox Code Playgroud)

或者,如果您希望计数是明确的,并且可以想出一种表达方式:

+ (void)doManyTimes:(NSInteger)numberOfTimes somethingToObjects:(id)firstObject, ...;
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用常规C方法处理位于stdarg.h中的省略号.还有那些快速文档这里,例如用法是:

+ (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);
}
Run Code Online (Sandbox Code Playgroud)

编辑:补充,以回应评论.由于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];
}
Run Code Online (Sandbox Code Playgroud)