在Objective-C中,可以在循环期间修改for循环的条件吗?

时间:2011-07-04 18:14:13

标签: objective-c macos for-loop conditional-statements

我的问题是,当执行for循环时,编译器是否读取了一次,然后开始执行带有保存值的循环?或者在循环执行时多次评估条件?例如,假设我有一个名为NSMutableArray的{​​{1}}。我的for循环看起来像这样:

myArray

我想要的是,如果一个对象被删除,要重新评估条件,所以for循环不会尝试对不存在的数组对象做任何事情,但我不希望它添加到计数,因为如果它确实,for循环将永远不会结束,因为它将继续添加添加更多对象的对象等。

7 个答案:

答案 0 :(得分:3)

每次循环时都会评估for循环中的条件。因此,添加/删除NSMutable数组更改条件的评估方式。请注意,它实际上并不是更改条件,只是评估它的结果。

请注意,如果要调用removeObjectAtIndex,则需要调整索引变量,以免意外跳过项目(即,如果删除当前索引处的项目。)

答案 1 :(得分:1)

您无法在循环运行时更改条件,并且每次执行循环时都会评估条件。我不知道你的案例的具体情况,但也许使用一个函数来解决你的问题?您可以将变量传递给函数,并且基于此变量,函数可以执行不同的检查,并相应地返回值。或者,如果需要在循环期间停止执行,也许可以使用break语句来结束循环。

答案 2 :(得分:1)

每次评估条件。您可以使用布尔方法作为条件轻松检查。像这样:

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

}

每次都会执行该方法。

答案 3 :(得分:1)

如前所述,每个循环都会重新评估条件,但您无法更改语句本身 但似乎你正在寻找更像的东西(假设你不想通过新添加的对象而条件不是独占的):

int size = [myArray count], i = 0;
while (i<size) {
    if (smallChance)
        [myArray addObject: object];
    if (evenSmallerChange) {
        [myArray removeObjectAtIndex:i];
        size--;
        i--;
    }
    i++;
}

答案 4 :(得分:0)

你应该在里面使用另一个for循环并检查任何条件并将其破坏。

顺便说一句,将for循环更改为

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

答案 5 :(得分:0)

我认为你想要的是:

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.
}

答案 6 :(得分:0)

通常,在循环运行时修改条件并不是一个好的实践。 如果您事先知道有多少转弯,则for语句是循环的首选方式。 无论如何,你可以修改条件......但考虑使用while而不是for。