【问题标题】:In Objective-C, can a for-loop's condition be modified during the loop?在 Objective-C 中,可以在循环期间修改 for 循环的条件吗?
【发布时间】:2011-09-28 07:46:15
【问题描述】:

我的问题是,当执行 for 循环时,编译器是否会读取一次,然后开始执行保存的值的循环?还是在执行循环时多次评估条件?例如,假设我有一个名为myArrayNSMutableArray。我的 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 循环将永远不会结束,因为它会不断添加添加更多对象的对象,等等。

【问题讨论】:

  • 你的条件应该是i 吗?

标签: 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++)
          

          【讨论】:

          • 嵌套循环中的break 不会结束外循环。
          • 是的,他需要再次打破它。
          【解决方案6】:

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

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

          每次都会执行该方法。

          【讨论】:

            【解决方案7】:

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-05-04
              • 1970-01-01
              • 1970-01-01
              • 2021-11-25
              • 2019-04-19
              • 1970-01-01
              相关资源
              最近更新 更多