Vector の新しい初期化方法 (Flex 4 & Flash Professional CS5)

Flash Professional CS5 と Flex SDK 4 から、初期値を指定して Vector を初期化できるようになりました。これはコンパイラーの仕様変更です。

いくつかの型では、既に、インスタンスを生成する際に 3 種類の手段、初期値の指定、コンストラクターの使用、グローバル関数の使用、を利用することができました。例えば、配列の場合は以下のようにしてインスタンスを生成することができます。

// 初期値を [] 内に指定
var arr1:Array = ["a", "b", "c"];
 
// コンストラクターを使用
var arr2:Array = new Array("a", "b", "c");
 
// グローバル関数を使用
var obj:Object = ["a", "b", "c"];
var arr3:Array = Array(obj);
 

(注:上の例の arr3 は、最初の要素に obj を持つ配列になります。つまり、arr3 は配列の配列です。ということで、この場合 Array() グローバル関数はキャストとしては使えません。Array 型で、キャストが目的のときには as 演算子を使用します。var arr3:Array = obj as Array; )

Vector のインスタンス生成手段は、いままではコンストラクターもしくはグローバル関数のどちらかでした。CS5 & Flex 4 からは、初期値を直接指定する構文が使えます。

Vector の初期化子指定

Vector は、配列と違って格納できる型が決まっています。そのため、Vector 型の属性宣言をする際、要素として持つオブジェクトの型も一緒に指定します。例えば、String を要素として持つ Vector 属性の宣言は下のように記述します。

var vec:Vector.<String>; // Stringだけを要素として持つVector型の属性
 

一般的な構文として記述する際は Vector.<T> という表記になります。ちょっと見慣れない書き方かもしれませんが、T は任意の型の意味で、int, Object, String などの代理として使われている記号です。

var vec:Vector.<T>; // 上のコードの一般的な書き方
 

さて、Vector の初期値を指定する場合の構文は以下の通りです。

new <T>[E0, E1, ..., En];
 

配列の場合と違うのは、new が必要なこと (ちょっと面倒) と、型指定が必要なこと (<T> の箇所) です。[] 内の要素 (E0, E1, ..., En と書いてある箇所) の型は、T で指定された型と同じにします。

具体的に、0, 1, 2 を値として持つ int 用の Vector を生成するには、以下のように書きます。

var vec:Vector.<int> = new <int>[0, 1, 2];
 

この方法で Vector を初期化する場合、いくつか注意事項があります。

  • 最後にコンマを付けて良いことになっています (例:[0, 1, 2, ])
  • 途中の要素を飛ばすことはできません (例:[0, , 2,])
  • 指定した要素の数が、生成される Vector の長さになります
  • Vector の長さを固定したい場合は、別途指定が必要です
  • 指定された要素の型と初期値の型が一致しない場合は、エラーになります (もしくは勝手に型変換されます)

Vector のコンストラクター

ここからは特に新しい話ではありませんが、いちおう。

下は Vector のコンストラクターです。普通のコンストラクターと違うのは、要素型を指定するために ".<T>" が "Vector" と "()" の間にあることです。

new Vector.<T>(length:uint = 0, fixed:Boolean = false);
 

要素型が String の Vector インスタンスを生成するには、例えば、下のように記述します。

var vec:Vector.<String> = new Vector.<String>();
 

コンストラクターの引数を指定しない場合は、引数のデフォルト値が使われるので、長さが 0 の (空の) Vector インスタンスが生成されます。また、長さは可変の状態です。

もし、事前に必要な要素の数が分かっている場合は、コンストラクターの第 1 引数に指定します。例えば、引数に 5 を指定すると、要素を 5 つ持った Vector が生成されます。この方法は、空の Vector を作って後から要素を入れるより、パフォーマンスが多少良くなると考えられます。

var vec:Vector.<int> = new Vector.<int>(5);
 

要素数を指定して Vector インスタンスを生成した場合、その Vector の持つ要素の初期値は指定された要素の "型" に依存します。型が null を値として持つ場合は、全ての要素の初期値が null になります。それ以外の型の場合は、その型のデフォルト値が全ての要素の初期値になります。例えば、要素型が int の場合、Vector インスタンス生成時の全ての要素の値は 0 です。

Vector は長さを固定にすることも可能です。コンストラクターの第 2 引数に true を指定すると、length 属性の変更や、length の値を変えるメソッド (push, pop など) は実行できなくなります。

var vec:Vector.<int> = new Vector.<int>(5, true);
 

長さを固定する/しないは、インスタンス生成後に fixed 属性を使って設定を変えることができます。

グローバル関数

Vector.<T>() グローバル関数を使っても Vector のインスタンスを生成することができます。利用パターンは 2 つあり、Array を Vector に変換する場合と、別の要素型の Vector に変換する場合 (例: Vector.<int> → Vector.<String>) です。

下は、Array オブジェクトを、String を要素として持つ Vector に変換する例です。

var arr:Array = ["one", "two", "three"];
var vec:Vector.<String> = Vector.<String>(arr);
 

グローバル関数は、配列内または Vector 内の個々の要素の変換も行います。(変換不能な要素があった場合はエラーが発生します)

var arr:Array = [1.5, "2", "three"];
var vec:Vector.<int> = Vector.<int>(arr);
trace(vec); // 1,2,0が出力される

ということから、グローバル関数は Vector の要素型のキャスト目的にも利用できることになります。

 

トラックバック(0)

トラックバックURL: http://cuaoar.jp/mt4/mt-tb.cgi/95

2014年1月

Sun Mon Tue Wed Thu Fri Sat
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31  
レンタルサーバー

月別 アーカイブ

Powered by Movable Type 4.261