Является ли обязательным 1-й аргумент переменной типа Objective C? - PullRequest
7 голосов
/ 09 сентября 2011

Вот пример переменной функции в Obj C.

// This method takes an object and a variable number of args
- (void) appendObjects:(id) firstObject, ...;

Действительно ли обязательно иметь первый аргумент в качестве объекта C Obj? Если нет, какой должен быть синтаксис?

РЕДАКТИРОВАТЬ: Спасибо за ваши ответы - первый аргумент не должен быть NSObject, но я хотел спросить: Можно ли вообще отказаться от первого аргумента? Я, вероятно, плохо сформулировал вопрос в первый раз; извините за это

- (void) appendObjects: ...;

Приведенное выше объявление выдает следующую ошибку: Expected ';' after method prototype

Ответы [ 3 ]

8 голосов
/ 09 сентября 2011

Это не должно быть что-то на самом деле. У каждого метода Objective-C есть два скрытых аргумента: self и _cmd (в этом порядке). self говорит само за себя (хаха), но менее известным является _cmd, который является просто селектором, который использовался для вызова текущего метода. Это позволяет использовать переменные аргументы с методами Objective-C, по-видимому, без использования начального аргумента, как вы делаете со стандартной функцией C с переменным числом.

- (void) someMethod:...
{
    va_list va;

    va_start(va, _cmd);

    // process all args with va_arg

    va_end(va);
}

Затем вы можете вызвать метод следующим образом:

 [someObj someMethod:1, 2, 3];
3 голосов
/ 09 сентября 2011

Способ Objective-C для реализации переменных аргументов такой же, как в стандартном C. Таким образом, вы можете передать аргументы объекта не-Objective-C.
Лично я бы использовал первый не скрытый аргумент для передачидлина следующего списка переменных (для объектов без Objective-C - в противном случае я бы использовал nil-Termination)

- (void)appendIntegers:(NSInteger)count, ...
{
    va_list arguments;
    //the start of our variadic arguments is after the mandatory first argument    
    va_start(arguments, count);
    for(NSUInteger i = 0; i < count; ++i)
    {
        //to add the non-object type variadic arg, wrap it in a NSNumber object
        [list addObject:[NSNumber numberWithInteger:va_arg(arguments, NSInteger)]];
    }
    va_end(arguments);
    NSLog(@"%@", list);
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    list = [NSMutableArray array];
    [self appendIntegers:3 /* count */, 1, 2, 3];
}
2 голосов
/ 09 сентября 2011

Нет, это не обязательно должен быть объект. Вы можете написать переменную функцию с плавающей запятой, например:

- (void) doSomethingWithFloats: (float) float1, ...;
...