В Objective-C можно ли изменить условие цикла for во время цикла? - PullRequest
1 голос
/ 04 июля 2011

Мой вопрос: при выполнении цикла for компилятор считывает его один раз, а затем начинает выполнять циклы с сохраненными значениями? Или это оценивает условие многократно, поскольку цикл выполняется? Например, скажем, у меня есть NSMutableArray с именем myArray. Мой цикл for выглядит примерно так:

    for (int i = 0; i < [myArray count]; i++){

[myArray addObject: object]; // this has maybe a 25% chance of happening
[myArray removeObjectAtIndex: whatever]; // also has a smaller chance of happening

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

Ответы [ 7 ]

3 голосов
/ 04 июля 2011

Условие в цикле for будет оцениваться каждый раз в цикле.Таким образом, добавление / удаление из массива NSMutable изменит способ оценки условия.Обратите внимание, что на самом деле не изменяет условие, а только результаты его оценки.

Обратите внимание, что если вы вызываете removeObjectAtIndex, вам нужно будет настроить переменную индекса так, чтобы вы неслучайно пропустить элемент (например, если вы удалите элемент с текущим индексом)

1 голос
/ 04 июля 2011

Как указывалось ранее, условие пересматривается в каждом цикле, но вы не можете изменить сам оператор.
Но, похоже, вы ищете что-то более похожее (если вы не хотите проходить зановодобавленные объекты и условия не являются исключительными):

int size = [myArray count], i = 0;
while (i<size) {
    if (smallChance)
        [myArray addObject: object];
    if (evenSmallerChange) {
        [myArray removeObjectAtIndex:i];
        size--;
        i--;
    }
    i++;
}
1 голос
/ 04 июля 2011

Условие оценивается каждый раз.Вы можете легко проверить это, используя в качестве условия логический метод.Примерно так:

for (int i = 0; [self booleanMethod:i]; i++) {

}

Метод будет выполняться каждый раз.

1 голос
/ 04 июля 2011

Вы не можете изменить условие во время выполнения цикла, и условие оценивается при каждом выполнении цикла. Я не знаю специфику вашего случая, но, возможно, использование функции вместо этого решит вашу проблему? Вы можете передать переменную в функцию, и, основываясь на этой переменной, функция может выполнять различные проверки и, соответственно, возвращать значение. Или, возможно, вы можете использовать оператор break для завершения цикла, если вам нужно остановить выполнение во время цикла.

0 голосов
/ 05 июля 2011

В общем, изменение условия во время работы цикла не является хорошей практикой.Оператор for является предпочтительным способом зацикливания, если вы заранее знаете, сколько ходов у вас есть.В любом случае, вы можете изменить условие ... но рассмотрите возможность использования while вместо for.

0 голосов
/ 04 июля 2011

Я думаю, что вы хотите:

int l = [myArray count];
for (int i=0; i<l; i++) {
    //Do anything you want here.
}

Таким образом, [myArray count] будет оцениваться только один раз для цикла for.

РЕДАКТИРОВАТЬ: Извините, не читалвторая часть полностью.Но то, что вы можете сделать, это изменить значение l условно.

//Inside the for loop
if(/*some condition*/) {
    l = [myArray count]; //Re-evaluate the condition.
}
0 голосов
/ 04 июля 2011

Вы должны использовать другую петлю for внутри и проверить любое условие и сломать его.

И, кстати, измените цикл for на

 for (int i = 0; i< [myArray count]; i++)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...