Можно ли перезапустить цикл 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];
}
}