2012-06-16 2 views
3

Я прочитал в документации Apple, что мы можем использовать необязательные параметры в вызове методов c. Пример из документации Apple:Способы и необязательные параметры

Способы, которые принимают переменное количество параметров, также возможны, , хотя они несколько редки. Дополнительные параметры разделяются запятыми после окончания имени метода. (В отличии от двоеточия, запятые не рассматривается как часть имени.) В следующем примере, мнимая makeGroup: метод передается один обязательный параметр (группа) и три параметров, которые не являются обязательными:

[receiver makeGroup:group, memberOne, memberTwo, memberThree]; 

Может ли кто-нибудь сказать, когда использовать эту функцию и как? есть ли какой-нибудь пример в API Apple?

благодаря

+0

héhé. Я устал. arrayWihObjects - хороший акселемент. – samir

+0

[Какао с любовью: Переменные списки аргументов в какао] (http://www.cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.html) – vikingosegundo

+0

Всякий раз, когда вы используете NSLog, вы используете эту функцию. –

ответ

10

Тип метода вы описываете, называется VARIADIC метод. Примеры в какао включают +[NSArray arrayWithObjects:] и +[NSDictionary dictionaryWithObjectsAndKeys:]. Вы получаете доступ к аргументам вариационного метода (или функции) с использованием макросов, определенных в stdarg.h.

Вот пример того, как метод +[NSArray arrayWithObjects:] может быть реализован:

+ (NSArray *)arrayWithObjects:(id)firstObject, ... { 
    int count = 0; 
    va_list ap; 
    va_start(ap, firstObject); 
    id object = firstObject; 
    while (object) { 
     ++count; 
     object = va_arg(ap, id); 
    } 
    va_end(ap); 

    id objects[count]; 
    va_start(ap, firstObject); 
    object = firstObject; 
    for (int i = 0; i < count; ++i) { 
     objects[i] = object; 
     object = va_arg(ap, id); 
    } 
    va_end(ap); 

    return [self arrayWithObjects:objects count:count]; 
} 
+0

Очень интересно. спасибо – samir

+0

Гораздо лучший ответ, чем мой. (проголосовали). Я не мог отследить специфику. Это не в документах, и если вы не знаете, какой заголовочный файл посмотреть, вам не повезло. –

+0

Обратите внимание, что переменные аргументы в методах следует использовать довольно экономно. Компилятор не может правильно ввести проверки аргументов. В общем, лучше всего иметь очень специфическую аргументацию (хотя, конечно, вариативные аргументы могут быть весьма полезными). – bbum

0

Я написал метод, как, что один или два раза. Это немного боль. Он очень похож на синтаксический анализ командной строки в программе C.

Я не помню, где я нашел документацию о том, как это сделать. Если я правильно помню, он использует функции va_start() и va_end().

Основным недостатком этого подхода является то, что список параметров с разделителями-запятыми не проверен типом и не имеет меток, как в обычных методах.

Основной способ использования этого подхода состоит в методе, подобном массиву NSArray, который должен содержать список параметров любого типа или NSLog.

Смежные вопросы