Метод с массивом входов - PullRequest
9 голосов
/ 04 февраля 2011

Я хочу иметь метод, в котором я могу указать столько аргументов, сколько мне нужно, например NSArray:

- (id)initWithObjects:(id)firstObj, ... NS_REQUIRES_NIL_TERMINATION;

Тогда я могу использовать:

NSArray *array = [[NSArray alloc] initWithObjects:obj1, obj2, ob3, nil];

Я могу добавить столько объектов, сколько захочу, если в конце добавлю 'nil', чтобы сказать, что я закончил.

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

Ответы [ 4 ]

22 голосов
/ 04 февраля 2011
- (void)yourMethod:(id) firstObject, ...
{
  id eachObject;
  va_list argumentList;
  if (firstObject)
  {               
    // do something with firstObject. Remember, it is not part of the variable argument list
    [self addObject: firstObject];
    va_start(argumentList, firstObject);          // scan for arguments after firstObject.
    while (eachObject = va_arg(argumentList, id)) // get rest of the objects until nil is found
    {
      // do something with each object
    }
    va_end(argumentList);
  }
}
3 голосов
/ 04 февраля 2011

У меня не было опыта работы с этими переменными методами (как они называются), но есть некоторая функциональность Cocoa, чтобы справиться с этим.

Из технических вопросов и ответов Apple QA1405 (фрагмент кода):

- (void)appendObjects:(id)firstObject, ...
{
    id eachObject;
    va_list argumentList;
    if (firstObject)                      // The first argument isn't part of the varargs list,
    {                                     // so we'll handle it separately.
        [self addObject:firstObject];
        va_start(argumentList, firstObject);          // Start scanning for arguments after firstObject.
        while ((eachObject = va_arg(argumentList, id))) // As many times as we can get an argument of type "id"
        {
            [self addObject:eachObject];              // that isn't nil, add it to self's contents.
        }
        va_end(argumentList);
    }
}

Скопировано из http://developer.apple.com/library/mac/#qa/qa2005/qa1405.html

3 голосов
/ 04 февраля 2011

Я думаю, что вы говорите о реализации метода вариации. Это должно помочь: Переменные аргументы в методах Objective C

0 голосов
/ 04 февраля 2011

Я бы попробовал это: http://www.numbergrinder.com/node/35

Apple предоставляет доступ к своим библиотекам для удобства. Чтобы узнать, сколько у вас есть элементов, перебирайте список, пока не нажмете ноль.

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

Надеюсь, это поможет!

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