【问题标题】:Is it possible to restart a for loop to its first iteration?是否可以将 for 循环重新启动到其第一次迭代?
【发布时间】:2014-07-15 12:57:55
【问题描述】:

在 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 循环——所以如果我能得到第二个意见,告诉我这是最好的方法,那正是我要争取的。不过,出于某种原因,我觉得必须有更好的方法。

【问题讨论】:

  • 你为什么不想用两个循环来做呢?这样做对我来说是有意义的。
  • @Fogmeister 我知道有更好的方法,但通常我只会使用 2 个循环。只是好奇人们能想出什么
  • 啊,好的,不用担心:D
  • 回到标记对象时不要忘记退出循环!甚至可能想用好对象本身作为标志,这样你就知道什么时候该打破了。 (我意识到这是伪代码。)

标签: objective-c for-loop fast-enumeration


【解决方案1】:

不使用快速枚举,否(goto 除外),但是如果您使用 indexed-access 方法,您可以:

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);
    }
}

【讨论】:

  • 您应该使用someflag 来确保您不会反复重置循环(或重新组织 if 语句以防止它)
  • 这不能正常重启。您将i 设置为0,但随后for 循环在返回顶部之前执行i++。因此,下一次迭代中,i 等于 1。此外,如果没有 continue 语句,将继续执行 if(someflag) ... 语句,并且 someflag 为真,因此它将执行 doStuffWithObject(object)当前对象(在返回顶部之前。
【解决方案2】:

如果你真的想这样做(而不是使用第二个循环,这几乎肯定更直接),你可以使用旧的goto

bool someflag = false;
restart:
for (id object in array)
{
  if(!someflag && object is good) 
  {
    someflag = true;
    goto restart;
  }
  if(someflag)
  {
    doStuffWithObject(object);
  }
}

【讨论】:

    【解决方案3】:

    考虑使用indexOfObjectPassingTest: 将代码中的逻辑分隔在“好”对象的检查(并获取索引)和后续处理之间。

    【讨论】:

      【解决方案4】:

      您可以为此使用 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];
          }
      }
      

      【讨论】:

      • 好的,这会产生一个无限循环,直到达到退出条件。当 smt 时你想去 0。发生。这将起作用。我认为@trojanfoe 有更好的答案;)
      猜你喜欢
      • 2010-12-28
      • 1970-01-01
      • 1970-01-01
      • 2021-07-14
      • 1970-01-01
      • 2015-03-14
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多