Можно ли перезапустить цикл for до его первой итерации?

в Objective-C можно ли перезапустить первую итерацию цикла for? Я не хочу ничего делать со своими объектами, пока не найду "хороший" объект, и в этот момент я хочу вернуться и сделать что-то с каждым объектом до этого хорошего объекта.

и

bool someflag = false;
for (id object in array)
{
  if(object is good) 
  {
    someflag = true;
    //restart to first object in loop
  }
  if(someflag)
  {
    doStuffWithObject(object);
  }
}

или есть другой/лучший способ сделать то, что я пытаюсь сделать?

очевидно, что простым способом было бы просто иметь два отдельных for петли -- поэтому, если бы я мог получить второе мнение сказать мне, что это лучший способ, это то, ради чего я буду стрелять. По какой-то причине у меня такое чувство, что должен быть лучший способ.

4 ответов


Не с быстрое перечисление, нет (за исключением перейти), однако, если вы используете индексированного доступа подхода, можно:

NSUInteger count = [array count];
for (NSUInteger i = 0; i < count; i++)
{
    bool someflag = false;
    id object = array[i];
    if (isgood(object)) 
    {
        someflag = true;
        //restart to first object in loop
        i = 0;
    }
    if(someflag)
    {
        doStuffWithObject(object);
    }
}

Если вы действительно хотите это сделать (а не использовать второй цикл, что почти наверняка более просто), вы можете использовать старый добрый goto:

bool someflag = false;
restart:
for (id object in array)
{
  if(!someflag && object is good) 
  {
    someflag = true;
    goto restart;
  }
  if(someflag)
  {
    doStuffWithObject(object);
  }
}

рассмотрите возможность использования indexOfObjectPassingTest: чтобы разделить логику в вашем коде между проверкой (и получением индекса) "хорошего" объекта и последующей обработкой.


вы можете использовать цикл while для этого

acutualElement = array.objectAtIndex[0];
int i = 0;
while(actualElemtnt =! null)
{
    if(...){
       do smth;
    } else {
       do smth different;
    }

    if (exit condition reached)
    {
       atualelement = null;
    }        
    else 
    {
       if (i < array.size) i++; //next element in array
       else i = 0; //first element in array
       actualElement = array.objectAtIndex[i];
    }
}