Цель c реализовать метод, который принимает массив аргументов - PullRequest
7 голосов
/ 10 марта 2011

Hee

Кто-нибудь знает, как реализовать метод в цели c, который будет принимать массив аргументов в качестве параметра, таких как:

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

Объявление метода для этого метода:

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

Кажется, я не могу сделать такой метод самостоятельно. Я сделал следующее:

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

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

Он выдаст предупреждение слишком много аргументов для функции 'doSometing: manyTimes:'

Спасибо уже.

Ответы [ 3 ]

12 голосов
/ 10 марта 2011

Многоточие (...) унаследовано от C; вы можете использовать его только в качестве последнего аргумента в вызове (и вы пропустили соответствующую запятую в вашем примере). Так что в вашем случае вы, вероятно, захотите:

+ (void)doSomethingToObjects:(id)firstObject, ...;

или, если вы хотите, чтобы счет был явным, и можете придумать, как правильно его сформулировать:

+ (void)doManyTimes:(NSInteger)numberOfTimes somethingToObjects:(id)firstObject, ...;

Затем вы можете использовать обычные методы 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);
}

РЕДАКТИРОВАТЬ: дополнения, в ответ на комментарии. Вы не можете передать различные вещи, переданные вам в виде многоточия, другой функции, которая принимает многоточие из-за способа, которым 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];
}
3 голосов
/ 10 марта 2011

Несколько аргументов (также называемых списком аргументов) могут приходить только в конце объявления метода. Ваш 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];

См. Также: Как создавать методы переменных аргументов в Objective-C

2 голосов
/ 10 марта 2011

Я думаю, что вы после вариадической функции.Вот документация Apple: http://developer.apple.com/library/mac/qa/qa2005/qa1405.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...