| ActionScript 3.0 のプログラミング > ActionScript プログラミングの概要 > ActionScript 言語とシンタックス > ループ | |||
ループステートメントを使用すると、一連の値または変数を使用して特定のコードブロックを繰り返し実行できます。コードブロックは常に中括弧 ({}) で囲むことをお勧めします。コードブロックに含まれるステートメントが 1 つのみ場合は中括弧を省略できますが、条件の場合と同じ理由から省略することはお勧めしません。これは、後で追加したステートメントがコードブロックから誤って除外される可能性が高くなるためです。コードブロックに含めるステートメントを後で追加するときに、必要な中括弧の追加を忘れた場合、そのステートメントはループの一部としては実行されません。
for ループを使用すると、特定の範囲の値に対する変数の繰り返し処理を実行することができます。for ステートメントには、3 つの式を指定する必要があります。それらの式は、初期値に設定する変数、ループがいつ終了するかを指定する条件ステートメント、および各ループで変数の値を変更する式です。たとえば、次のコードは 5 回ループします。変数 i は 0 で始まり、4 で終わります。出力は 0 ~ 4 の数値となり、各数値は個別の行に出力されます。
var i:int;
for (i = 0; i < 5; i++)
{
trace(i);
}
for..in ループは、オブジェクトのプロパティまたは配列のエレメントの繰り返し処理を実行します。たとえば、for..in ループを使用して、汎用オブジェクトのプロパティの繰り返し処理を実行できます。オブジェクトのプロパティは特定の順序では維持されないので、プロパティは予期しない順序で表示されることがあります。
var myObj:Object = {x:20, y:30};
for (var i:String in myObj)
{
trace(i + ": " + myObj[i]);
}
// 出力 :
// x: 20
// y: 30
配列のエレメントの繰り返し処理を実行することもできます。
var myArray:Array = ["one", "two", "three"];
for (var i:String in myArray)
{
trace(myArray[i]);
}
// 出力 :
// one
// two
// three
クラスがダイナミッククラスでない限り、オブジェクトがユーザー定義クラスのインスタンスである場合、そのプロパティの繰り返し処理を実行することはできません。ダイナミッククラスのインスタンスの場合であっても、動的に追加されるプロパティによってしか繰り返し処理を実行できません。
for each..in ループは、XML または XMLList オブジェクトのタグ、オブジェクトプロパティが保持する値、または配列のエレメントのいずれかにすることができる、コレクションの項目の繰り返し処理を実行します。たとえば、次の抜粋に示すように、for each..in ループを使用して汎用オブジェクトのプロパティの繰り返し処理を実行できますが、for..in ループとは異なり、for each..in ループのイテレータ変数には、プロパティの名前ではなく、プロパティが保持する値が含まれます。
var myObj:Object = {x:20, y:30};
for each (var num in myObj)
{
trace(num);
}
// 出力 :
// 20
// 30
次の例に示すように、XML または XMLList オブジェクトの繰り返し処理を実行することができます。
var myXML:XML = <users>
<fname>Jane</fname>
<fname>Susan</fname>
<fname>John</fname>
</users>;
for each (var item in myXML.fname)
{
trace(item);
}
/* 出力
Jane
Susan
John
*/
以下の例が示すように、配列のエレメントの繰り返し処理を実行することもできます。
var myArray:Array = ["one", "two", "three"];
for each (var item in myArray)
{
trace(item);
}
// 出力 :
// one
// two
// three
オブジェクトが sealed クラスのインスタンスである場合、そのプロパティの繰り返し処理を実行することはできません。ダイナミッククラスのインスタンスの場合であっても、クラス定義の一部として定義されるプロパティである固定プロパティの繰り返し処理を実行することはできません。
while ループは、条件が true である場合に繰り返す if ステートメントに似ています。たとえば、次のコードは、for ループの例と同じ出力を作成します。
var i:int = 0;
while (i < 5)
{
trace(i);
i++;
}
for ループの代わりに while ループを使用する短所の 1 つは、while ループを使用すると無限ループを記述する可能性が高いことです。カウンタ変数をインクリメントする式を省略した場合、for ループのサンプルコードはコンパイルされませんが、while ループのサンプルコードはコンパイルされます。i をインクリメントする式がないと、ループは無限ループになります。
do..while ループは、コードブロックの実行後に条件がチェックされるため、コードブロックが少なくとも 1 回は実行される while ループです。次のコードでは、条件が満たされない場合でも出力を生成する do..while ループの簡単な例を示します。
var i:int = 5;
do
{
trace(i);
i++;
} while (i < 5);
// 出力 : 5
Flex 2.01