« データ型の変換 | メイン | 配列演算子を使う »

厳密な型指定

ActionScriptではデータ型は適当に解釈されるためにデータ型を指定しなくても利用できます。しかし、場合によってはこの柔軟さがエラーの原因になったり、バグの発見を遅らせる要因になります。
変数や関数の引数、関数の戻り値に厳密なデータ型を設定すれば、コンパイル時にデータ型がチェックされるようになります。
また、データ型を指定すれば名前の接尾辞をつけなくとも式をタイプする際にピリオド(.)に続いてコードヒントが表示されるようになります。(コードヒント→p.??)
ただし、データ型がチェックされるのはスクリプトのコンパイル時だけなので注意が必要です。実行時に指定した以外の型のデータが与えられてもエラーになりません。

■変数のデータ型
変数に厳密なデータ型を指定するには、変数をvarで宣言しなければなりません。そして、変数名に続いてコロン(:)を書き、それに続けてデータ型を書きます。

例:
var myV:Number;
var myName:String;
var myData:Array;

この例のように変数のデータ型を設定した場合に次のスクリプトは「代入ステートメントでタイプが一致しません。」というコンパイルエラーになります。

例:コンパイル時にエラーになる
myV = "123";
myName = 2004;
myData = "test, 123";


図3-4-2 データ型が一致しないのでコンパイルエラーになります。

ただし、次のようなスクリプトではコンパイル時にvのデータ型を特定できずにエラーになりません。

例:
var v = 12;
var s:String = v; // エラーにならない

このようなケースをコンパイルエラーにするには、次のように変数vのデータ型も厳密に指定する必要があります。

例:
var v:Number = 12;
var s:String = v; // コンパイルエラーになる

■関数の引数のデータ型
関数の引数のデータ型を指定するには引数名に続けてコロン(:)を書き、それに続けてデータ型を書きます。なお、先にも書いたようにデータ型がチェックされるのはスクリプトのコンパイルです。ムービー再生中に関数が呼ばれるたびに引数のデータ型がチェックされるわけではないので注意してください。

例:
function nefuda(genka:Number, kinsyu:String) {
var ans:String = genka * 1.2 + kinsyu;
return ans;
}

この例ではnefuda()関数の1番目の引数は数値、2番目の引数はストリングでなければコンパイルエラーになります。

例:
nefuda_txt.text = nefuda("ドル" , 25); // コンパイルエラー
nefuda_txt.text = nefuda(190 , "円"); // OK

次のスクリプトでは引数の並びが逆でデータ型が一致しないのでコンパイルエラーになるように思えますが、変数の厳密なデータ型の指定の場合と同様にエラーになりません。

例:
g = 25;
k = "ドル";
nefuda_txt.text = nefuda(k, g); // エラーにならないので注意が必要

次のように変数g、kのデータ型が厳密に設定されていればエラーになります。

例:
var g:Number = 25;
var k:String = "ドル";
nefuda_txt.text = nefuda(k, g); // コンパイルエラー

sample → nefuda.fla

■関数の戻り値のデータ型
関数の引数だけでなく、戻りの値のデータ型を設定できます。たとえば、変数xのデータ型がNumberに設定されているとき、test()関数から戻る値のデータ型がわからないと変数xへの代入が妥当かどうか判断できません。そこで関数の戻りの値にもデータ型を設定しておきます。関数の戻りのデータ型を設定するには、引数を囲む()に続いてコロン(:)を書き、それに続けてデータ型を指定します。
次の例は、先のnefuda()の戻り値のデータ型をStringに設定しています。

例:戻り値のデータ型を定義する
function nefuda(genka:Number, kinsyu:String):String {
var ans:String = genka * 1.2 + kinsyu;
return ans;
}

関数の戻り値にもデータ型を設定すれば、変数への代入する時点でのデータ型の妥当性をチェックできます。

例:戻り値のデータ型がチェックされる
var lavel:String = nefuda(500, "円");


■メソッドのデータ型
メソッ定義では値を返しません。そこで、メソッド定義のデータ型はVoidにします。

例:メソッドのデータ型はVoidにする
fucrion move(target:MovieClip, x:Number, y:Number):Void {
target._x += x;
target._y += y;
}

■インスタンスのデータ型
クラスから作ったインスタンスは、そのクラスのデータ型をもちます。たとえば、Dateクラスから作ったmyDate、XMLクラスからmyXMLはそれぞれDate、XMLというデータ型を指定できます。ユーザーが定義したカスタムクラスでも同じです。MyClassクラスのインスタンスはMyClassデータ型になります。なお、インスタンスはObject型でもあるので、データ型としてObjectを指定することもできます。

例:インスタンスはクラスのデータ型になる
var myDate:Date = new Date();
var myXML:XML = new XML();
var myObj:MyClass = new MyClass();

■オブジェクトのキャスト
キャストという手法を使うと、コンパイル時のデータチェックにおいて、オブジェクト(インスタンス)のデータ型を別のデータ型として認識させることができます。
キャストはtype(item)という形式をとります。たとえば、MyClass()というカスタムクラスがあったとき、あるデータをMyClassクラスのデータ型にキャストしたい場合にはMyClass(data)のように書きます。これはString(x)、Number(y)などと共通した書式なのでわかりやすく利用できます。

投稿者 oshige : 2005年2月15日 16:05