【问题标题】:In Objective-C, can a for-loop's condition be modified during the loop?在 Objective-C 中,可以在循环期间修改 for 循环的条件吗?
【发布时间】:2011-09-28 07:46:15
【问题描述】:
我的问题是,当执行 for 循环时,编译器是否会读取一次,然后开始执行保存的值的循环?还是在执行循环时多次评估条件?例如,假设我有一个名为myArray 的NSMutableArray。我的 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 循环将永远不会结束,因为它会不断添加添加更多对象的对象,等等。
【问题讨论】:
标签:
objective-c
macos
for-loop
conditional-statements
【解决方案1】:
一般来说,在循环运行时修改条件并不是一个好习惯。
如果您事先知道有多少回合,for 语句是循环的首选方式。
无论如何,您可以修改条件...但请考虑使用 while 而不是 for。
【解决方案2】:
如前所述,每个循环都会重新评估条件,但您不能更改语句本身。
但似乎您正在寻找更像的东西(假设您不想遍历新添加的对象并且条件不是排他性的):
int size = [myArray count], i = 0;
while (i<size) {
if (smallChance)
[myArray addObject: object];
if (evenSmallerChange) {
[myArray removeObjectAtIndex:i];
size--;
i--;
}
i++;
}
【解决方案3】:
for 循环中的条件将在每次循环中进行评估。因此,在 NSMutable 数组中添加/删除将改变条件的评估方式。请注意,它实际上并没有改变条件,只是评估它的结果。
请注意,如果您正在调用 removeObjectAtIndex,则需要调整索引变量,以免意外跳过某个项目(即,如果您删除了当前索引处的项目。)
【解决方案4】:
我想你想要的是:
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.
}
【解决方案5】:
您应该在内部使用另一个 for 循环并检查任何条件并打破它。
顺便说一句,将 for 循环更改为
for (int i = 0; i< [myArray count]; i++)
【解决方案6】:
每次都会评估条件。您可以使用布尔方法作为条件轻松检查。像这样的:
for (int i = 0; [self booleanMethod:i]; i++) {
}
每次都会执行该方法。
【解决方案7】:
您不能在循环运行时更改条件,并且每次执行循环时都会评估条件。我不知道您的具体情况,但也许使用函数可以解决您的问题?您可以将变量传递给函数,并且基于此变量,函数可以执行不同的检查,并相应地返回一个值。或者,如果您需要在循环期间停止执行,您可以使用break 语句来结束循环。