ActionScript3.0のVectorクラス

私は、今までFlashPlayer9書き出しで仕事をしてきましたが、FlashPlayer10の普及率を考えるとそろそろFlashPlayer10書き出しでも問題ないかなと思い始めました。そこで今回は、FlashPlayer10で新たに追加されたActionScript3.0のVector(ベクター)クラスに関する学習メモです。

Vectorクラスは、配列用のクラスなので多くの部分でArrayクラスと似ています。Arrayクラスと大きく違う点は、エレメントのデータ型を指定できる点でしょう。Vectorクラスのエレメントのデータ型はベース型と言い、後置型パラメータシンタックスを使用して指定するようです。

まず簡単なサンプルでテストしてみましょう。Vectorクラスのベース型の指定は、Vector.<データ型>といった記述で行います。なおVectorクラスは、Arrayクラスと同じようにトップレベルのパッケージなのでimport文は必要ありません。

ActionScript3.0

var foo_array:Array;
foo_array = new Array();
foo_array[0] = "abcde";
foo_array[1] = "あいうえお";
foo_array[2] = 12345;
trace("foo_array :", foo_array);
trace("foo_array.length :", foo_array.length);

var foo_vector:Vector.<String>;
foo_vector = new Vector.<String>();
foo_vector[0] = "abcde";
foo_vector[1] = "あいうえお";
foo_vector[2] = String(12345);
trace("foo_vector :", foo_vector);
trace("foo_vector.length :", foo_vector.length);

上の例では、Arrayクラスはエレメントのデータ型を指定できないので、String型やNumber型をそのまま格納できています。しかし、Vectorクラスではベース型をString型で指定したので、Number型を格納する際にはString型でキャストする必要があります。

ActionScript3.0では、データ型を指定することにより、処理の高速化やランタイムデバッグといった恩恵を受けることができますが、Vectorクラスはエレメントのデータ型が指定できるので、Arrayよりも処理が高速なようです。また、異なるデータ型を格納しようとした時点でエラーを出してくれるので、デバッグも楽になります。

気を付けるべき点としては、Vectorクラスでは、必ず0から順番にインデックスを指定しなければならない点でしょう。次の例は、Arrayクラスでは問題ありませんが、Vectorクラスではエラーになります。

ActionScript3.0

var bar_array:Array = new Array();
bar_array[0] = 10;
bar_array[2] = 1000;
trace("bar_array :", bar_array);
trace("bar_array.length :", bar_array.length);

var bar_vector:Vector.<uint> = new Vector.<uint>();
bar_vector[0] = 10;
bar_vector[2] = 1000;
trace("bar_vector :", bar_vector);
trace("bar_vector.length :", bar_vector.length);

またVectorクラスは、Arrayクラスにはないfixedプロパティを持っており、lengthプロパティを固定することができます。次の例では、Vectorのfixedをtrueにした後で、push()でエレメントを追加しようとしていますが、エラーになります。

ActionScript3.0

var hoge_vector:Vector.<DisplayObject> = new Vector.<DisplayObject>();
hoge_vector[0] = new Sprite();
hoge_vector[1] = new MovieClip();
trace("hoge_vector :", hoge_vector);
trace("hoge_vector.length :", hoge_vector.length);
trace("hoge_vector.fixed :", hoge_vector.fixed);
hoge_vector.fixed = true;
trace("hoge_vector.fixed :", hoge_vector.fixed);
hoge_vector.push(new Sprite());

また、記述は少し面倒ですが、Vectorクラスでも多次元配列を扱うことは可能なようです。次の例では多次元配列を作成する際にnew演算子ではなく、トップレベルのVector()関数を使用しています。

ActionScript3.0

var baz_vector:Vector.<Vector.<Boolean>> = new Vector.<Vector.<Boolean>>();
baz_vector[0] = Vector.<Boolean>([true, false]);
baz_vector[1] = Vector.<Boolean>([false, true]);
trace("baz_vector[0][0] :", baz_vector[0][0]);
trace("baz_vector[0][1] :", baz_vector[0][1]);
trace("baz_vector[1][0] :", baz_vector[1][0]);
trace("baz_vector[1][1] :", baz_vector[1][1]);

以上、ArrayクラスとVectorクラスの違いを中心に見てきましたが、違いといってもこれくらいです。リファレンスを見比べてみましたが、ほとんどArrayクラスと同じプロパティやメソッドを持っているので、違和感なく使用できると感じました。これからは、ArrayクラスとVectorクラスを上手く使い分けていきたいと思います。