2011-07-04 18 views
1

私の質問は、for-loopが実行されると、コンパイラは一度それを読んでから、値を保存してループを実行し始めますか?または、ループが実行されるときに条件を何度も評価しますか?たとえば、私にと呼ばれるNSMutableArrayがあるとします。私のforループは次のようになります。Objective-Cでは、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ループが終了しても、オブジェクトを追加するオブジェクトを追加し続けるので、カウントに追加したくありません。

+2

条件は* [ dlev

+0

はい、ありがとうございます。 – Regan

答えて

3

for-loopの条件は、ループのたびに評価されます。したがって、NSMutable配列に追加/削除すると、は状態の評価方法を変更します。それは実際にはの変更の状態ではなく、それを評価した結果だけであることに注意してください。

なお、あなたが誤ってアイテムをスキップしないように(つまり、あなたは現在のインデックスにある項目を削除した場合。)あなたのインデックス変数を調整する必要がありますremoveObjectAtIndexを

1

条件を変更することはできません。ループが実行され、ループが実行されるたびに条件が評価されます。あなたのケースの詳細はわかりませんが、代わりに関数を使用すると問題が解決するでしょうか?関数に変数を渡すことができ、この変数に基づいて、関数は異なる検査を実行し、それに応じて値を返します。ループ中に実行を停止する必要がある場合は、breakステートメントを使用してループを終了することもできます。

1

条件呼び出す場合毎回評価されます。条件としてブールメソッドを使用すると、簡単にチェックできます。このようなもの:

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

} 

このメソッドは毎回実行されます。

0

ループを別のforループ内に使用​​し、条件を確認して中断する必要があります。

そしてところで、私が何をしたいことはあると思い

for (int i = 0; i< [myArray count]; i++) 
+0

ネストされたループ内の 'break'は、外側ループを終了しません。 –

+0

はい、彼は再びそれを壊す必要があります。 – Legolas

0

forループを変更:

int l = [myArray count]; 
for (int i=0; i<l; i++) { 
    //Do anything you want here. 
} 

この方法で、[myArray count]はのためのループのために一度だけ評価されます。

編集:申し訳ありませんが、2番目の部分を完全に読んではいけません。しかし、あなたができることは、条件付きでlの値を変更することです。

//Inside the for loop 
if(/*some condition*/) { 
    l = [myArray count]; //Re-evaluate the condition. 
} 
1

前述のように、条件はすべてのループで再評価されますが、ステートメント自体は変更できません。
しかし、あなたがより多くの(あなたが新しく追加されたオブジェクトを通過する必要はありませんし、条件が排他的ではありませんと仮定した場合)のようなものを探しているようだ:一般的に

int size = [myArray count], i = 0; 
while (i<size) { 
    if (smallChance) 
     [myArray addObject: object]; 
    if (evenSmallerChange) { 
     [myArray removeObjectAtIndex:i]; 
     size--; 
     i--; 
    } 
    i++; 
} 
0

、一方で条件を変更しますループが走っているのは良いことではない。 for文は、あなたが前に何ターン持っているか知っていればループするのが好ましい方法です。 とにかく、条件を変更することはできますが、forの代わりにwhileを使用することを検討してください。

関連する問題