2014-07-15 26 views
6

Trong Mục tiêu-C, có thể khởi động lại lần lặp đầu tiên của vòng lặp for không? Tôi không muốn làm bất cứ điều gì với các đối tượng của tôi cho đến khi tôi tìm thấy một đối tượng "tốt", tại thời điểm đó tôi muốn quay trở lại và làm mọi thứ với mọi vật thể đến đối tượng tốt đó.Có thể khởi động lại vòng lặp for cho lần lặp đầu tiên của nó không?

Vì vậy,

bool someflag = false; 
for (id object in array) 
{ 
    if(object is good) 
    { 
    someflag = true; 
    //restart to first object in loop 
    } 
    if(someflag) 
    { 
    doStuffWithObject(object); 
    } 
} 

Hoặc là có một/cách khác tốt hơn để làm những gì tôi đang cố gắng để làm gì? Rõ ràng là cách dễ dàng là chỉ có hai vòng riêng biệt for - vì vậy nếu tôi có thể nhận được ý kiến ​​thứ hai cho tôi biết đó là cách tốt nhất, đó chỉ là những gì tôi sẽ quay. Vì một lý do nào đó, tôi có cảm giác phải có một cách tốt hơn.

+1

Tại sao bạn không muốn thực hiện điều đó bằng hai vòng? Sẽ có ý nghĩa với tôi để làm điều đó theo cách đó. – Fogmeister

+0

@ Fogmeister Tôi có một ý tưởng rằng có một cách tốt hơn, nhưng thông thường tôi sẽ chỉ sử dụng 2 cho vòng lặp. Chỉ là tò mò như những gì mọi người có thể đến với –

+0

Ah, ok, không phải lo lắng: D – Fogmeister

Trả lời

5

Không phải với liệt kê nhanh, không có (với ngoại lệ của goto), tuy nhiên nếu bạn sử dụng lập chỉ mục truy cập cách tiếp cận, bạn có thể:

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

Bạn nên sử dụng 'someflag' để đảm bảo bạn không đặt lại vòng lặp nhiều lần (hoặc sắp xếp lại các câu lệnh if để ngăn chặn nó) – Wain

+0

@Wain Thật vậy; cảm ơn. – trojanfoe

+0

Điều này không khởi động lại đúng cách. Bạn đặt 'i' thành 0 nhưng sau đó vòng lặp' for' thực thi 'i ++' trước khi quay lại đầu trang. Vì vậy, lần lặp tiếp theo bằng với 'i' bằng 1. Ngoài ra, không có câu lệnh' continue', thực thi sẽ tiến hành câu lệnh 'if (someflag) ...' và 'someflag' là đúng, vì vậy nó sẽ thực hiện 'doStuffWithObject (đối tượng)' với đối tượng hiện tại (trước khi quay trở lại đầu trang) –

1

Xem xét sử dụng indexOfObjectPassingTest: để tách logic trong mã của bạn giữa kiểm tra (và nhận được chỉ mục) của đối tượng 'tốt' và xử lý tiếp theo.

0

bạn có thể sử dụng một vòng lặp while cho điều này

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, điều này tạo ra một vòng lặp vô tận cho đến khi điều kiện thoát đạt được, bạn muốn đi đến 0 khi smt xảy ra. @trojanfoe có câu trả lời tốt hơn;) – Starbax

3

Nếu bạn thực sự muốn làm điều này (thay vì sử dụng một vòng lặp thứ hai, đó là gần như chắc chắn đơn giản hơn), bạn có thể sử dụng tốt cũ goto:

bool someflag = false; 
restart: 
for (id object in array) 
{ 
    if(!someflag && object is good) 
    { 
    someflag = true; 
    goto restart; 
    } 
    if(someflag) 
    { 
    doStuffWithObject(object); 
    } 
} 
Các vấn đề liên quan