2014-07-15 173 views
6

在Objective-C中,是否可以重新啓動for循環的第一次迭代?我不想對我的物體做任何事情,直到我找到一個「好」的物體,在這一點上,我想回到原點,對每一個物體做一些事情,直到那個好物體。是否有可能重啓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循環 - 所以如果我能得到第二個意見,告訴我這是最好的方式,那就是我要拍的。出於某種原因,我有一種感覺,那就是有一種更好的方式。

+1

爲什麼你不想用兩個循環做到這一點?對我來說這樣做是有道理的。 – Fogmeister

+0

@Fogmeister我有一個暗示,有更好的方法,但通常我會使用2 for循環。只是好奇,人們能想出什麼 –

+0

啊,好的,不用擔心:D – Fogmeister

回答

5

不與快速列舉,沒有(與goto除外),但是如果你使用索引訪問的方法,你可以:

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

你應該使用'someflag'來確保你不會重複地重複循環(或者重新組織if語句來防止它) – Wain

+0

@Wain確實;謝謝。 – trojanfoe

+0

這不能正常重啓。你將'i'設置爲0,但是然後'for'循環在返回頂端之前執行'i ++'。因此,下一個迭代與'i'等於1.另外,如果沒有'continue'語句,執行將進行到'if(someflag)...'語句,'someflag'爲真,所以它會在返回頂端執行'doStuffWithObject(object)'(在返回頂部之前執行) –

1

考慮使用indexOfObjectPassingTest:的邏輯中分離出來您的代碼在「好」對象的檢查(以及獲取索引)和後續處理之間進行。

0

你可以使用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]; 
    } 
} 
+0

ok,這會產生一個無限循環,直到退出條件到達爲止,當smt。發生時你想要0,這將會起作用。 @trojanfoe有更好的答案;) – Starbax

3

如果你真的想這樣做(而不是使用的第二環,這幾乎肯定是更直接的),你可以用好老goto

​​