■データ型の指定(型注釈)
変数や関数の戻り値にデータ型(データタイプ)を指定できます。データ型には取り得る値の属性や範囲を指定してあります。たとえば、Boolean型はtrueまたはfalseの2つの値のどちらかになります。同様にString型はストリングのみで、int型は-2,147,483,648〜2,147,483,647の範囲の整数のみの値になるという具合です。データ型の指定はクラスを指定することであり、その値を扱えるクラスを宣言することとも言えます。
データ型を指定すればコンパイル時に型のチェックが行われ、不適当な場合にはコンパイルエラーになります。また、変数にデータ型を指定することで、変数を宣言した時点での初期値がデータ型に応じて決定します。
例:変数にデータ型を指定する
変数や関数の戻り値にデータ型(データタイプ)を指定できます。データ型には取り得る値の属性や範囲を指定してあります。たとえば、Boolean型はtrueまたはfalseの2つの値のどちらかになります。同様にString型はストリングのみで、int型は-2,147,483,648〜2,147,483,647の範囲の整数のみの値になるという具合です。データ型の指定はクラスを指定することであり、その値を扱えるクラスを宣言することとも言えます。
データ型を指定すればコンパイル時に型のチェックが行われ、不適当な場合にはコンパイルエラーになります。また、変数にデータ型を指定することで、変数を宣言した時点での初期値がデータ型に応じて決定します。
例:変数にデータ型を指定する
var user:String; var age:uint; var points:Number; var hobby:Array;
コンパイルエラーを避けるためにデータ型を指定せずに変数を宣言することもできます。この場合には明示的に型注釈に*を使うことができます。また、undefinedを代入したい変数のデータ型も*で宣言します。データ型を指定した変数にundefinedを代入するとnullと置き換えられます。
例:データ型指定なしで変数を宣言する
[:note:]
データ型を宣言しない場合、ActionScript 2.0まではObject型が割り当てられましたが、ActionScript 3.0からはデータ型指定なしという状態になります。
■データ型の種類
データ型は大きく2つのタイプに分けることができます。1つは実際の値をもつプリミティブ型、2つ目は値への参照をもつオブジェクト型(コンポジット型)です。プリミティブ型には、Boolean、int、Null、Number、String、uint、voidがあります。オブジェクト型にはObject、Array、Date、Error、Function、RegExp、XML、XMLListが定義されています。
ArrayやDateなどのオブジェクト型のデータの場合には、変数の値を移動しても参照を渡すだけで実体は1個である点に注意が必要です。たとえば、次のようにArrayクラスのインスタンスを変数aに作り、変数aの値を変数bに代入します。このとき、変数aと変数bは同じインスタンスを参照しているだけなので、どちらか一方の変数の値を更新するともう片方も値が変わります。(配列を複製する→p.??)
[:sample:] objectArray.fla
例:
これはDateクラスで試しても同じ事が起こります。次の例はaDayをbDayに入力した後でbDayの日付を10に設定しています。するとaDayの日付も10に変わっています。
[:sample:] objectDate.fla
例:
■インスタンスのデータ型
クラスから作ったインスタンスは、そのクラスのデータ型をもちます。たとえば、Dateクラスから作ったmyDateはDateタイプ、Spriteクラスから作ったmySpriteはSpriteタイプのデータ型になります。ユーザーが作ったカスタムクラスも同じです。MyClassクラスのインスタンスのデータ型はMyClassになります。なお、インスタンスはすべてObjectクラスを基本クラスにしているのでObjectタイプを指定することもできます。
例:
■データ型のチェック is、as、typeof
実行中に値のデータ型をチェックしたい場合には、目的に応じてis、as、typeofの演算子を使い分けます。is演算子はデータ型が一致したときtrue、それ以外はfalseを返します。データ型は継承している基本クラスまで調べて比較します。また、インターフェイスが実装されているかどうかも比較できます。
[:sample:] isTest-1.fla
例:
as演算子はデータ型が一致したときその値を返し、一致しないときはnullを返します。
[:sample:] asTest-1.fla
例:
これにより、値がnullになる場合だけを考慮したスクリプトを書くことができます。
[:sample:] asTest-2.fla
例:
例:データ型指定なしで変数を宣言する
var tmp; var loadData:* = loaderObj.content; var ghost:* = undefined;
[:note:]
データ型を宣言しない場合、ActionScript 2.0まではObject型が割り当てられましたが、ActionScript 3.0からはデータ型指定なしという状態になります。
■データ型の種類
データ型は大きく2つのタイプに分けることができます。1つは実際の値をもつプリミティブ型、2つ目は値への参照をもつオブジェクト型(コンポジット型)です。プリミティブ型には、Boolean、int、Null、Number、String、uint、voidがあります。オブジェクト型にはObject、Array、Date、Error、Function、RegExp、XML、XMLListが定義されています。
データ型 初期値 取り得る値 備考 Boolean false trueまたはfalse int 0 整数(-2,147,483,648〜2,147,483,647) Null null null 型注釈には使えない。 Number NaN 整数、符号なし整数、浮動小数点数int、uintの範囲外の値に使う。 String null ストリング nullと空ストリング""は異なる。 uint 0 整数(0〜4,294,967,295) void undefined undefined 戻り値の型注釈としてのみ使用する。 Object null すべてのクラスの値 undefinedはnullに変換される
ArrayやDateなどのオブジェクト型のデータの場合には、変数の値を移動しても参照を渡すだけで実体は1個である点に注意が必要です。たとえば、次のようにArrayクラスのインスタンスを変数aに作り、変数aの値を変数bに代入します。このとき、変数aと変数bは同じインスタンスを参照しているだけなので、どちらか一方の変数の値を更新するともう片方も値が変わります。(配列を複製する→p.??)
[:sample:] objectArray.fla
例:
var alist:Array; var blist:Array; alist = new Array("a", "b", "c"); blist = alist; trace(alist.toString()); //出力:a,b,c blist.push("d"); trace(alist.toString()); //出力:a,b,c,d
これはDateクラスで試しても同じ事が起こります。次の例はaDayをbDayに入力した後でbDayの日付を10に設定しています。するとaDayの日付も10に変わっています。
[:sample:] objectDate.fla
例:
var aDay:Date; var bDay:Date; aDay = new Date(); bDay = aDay; trace(aDay.getDate()); //出力:7 bDay.setDate(10); trace(aDay.getDate()); //出力:10
■インスタンスのデータ型
クラスから作ったインスタンスは、そのクラスのデータ型をもちます。たとえば、Dateクラスから作ったmyDateはDateタイプ、Spriteクラスから作ったmySpriteはSpriteタイプのデータ型になります。ユーザーが作ったカスタムクラスも同じです。MyClassクラスのインスタンスのデータ型はMyClassになります。なお、インスタンスはすべてObjectクラスを基本クラスにしているのでObjectタイプを指定することもできます。
例:
var myDate:Date = new Date(); var mySprite:Sprite = new Sprite(); var myObj:MyClass = new MyClass();
■データ型のチェック is、as、typeof
実行中に値のデータ型をチェックしたい場合には、目的に応じてis、as、typeofの演算子を使い分けます。is演算子はデータ型が一致したときtrue、それ以外はfalseを返します。データ型は継承している基本クラスまで調べて比較します。また、インターフェイスが実装されているかどうかも比較できます。
[:sample:] isTest-1.fla
例:
var price:int = 250; trace(price is int); //出力:true trace(price is Number); //出力:true trace(price is String); //出力:false var vlist:Array = [3, 5, 8]; trace(vlist is Array); //出力:true trace(vlist is Object); //出力:true trace(vlist is Number); //出力:false var clip:MovieClip = new ballMC(); trace(clip is MovieClip); //出力:true trace(clip is Sprite); //出力:true trace(clip is DisplayObject); //出力:true
as演算子はデータ型が一致したときその値を返し、一致しないときはnullを返します。
[:sample:] asTest-1.fla
例:
var vlist:Array = [250, -30, "red"]; trace(vlist[0] as int); //出力:250 trace(vlist[1] as int); //出力:-30 trace(vlist[2] as int); //出力:null
これにより、値がnullになる場合だけを考慮したスクリプトを書くことができます。
[:sample:] asTest-2.fla
例:
var vlist:Array = [250, -30, 2.5, "red"]; var i:int; var cnt:uint = vlist.length; for (i=0; i
また、as演算子は評価した値を評価したデータ型にして返すことから、キャストすなわち値のタイプを変換する目的でも利用されます。(キャスト→p.??)
typeofはタイプ型に応じた情報をストリングで返します。データ型によって返される値は次のようになっています。
データ型 結果 Array "object" Boolean "boolean" Function "function" int "number" Number "number" Object "object" String "string" uint "number" XML "xml" XMLList "xml"
[:sample:] typeofTest-1.fla
例:var price:int = 250; trace(typeof price); //出力:number var state:Boolean = true; trace(typeof state); //出力:boolean var msg:Boolean = "test"; trace(typeof msg); //出力:boolean var vlist:Array = [3, 5, 8]; trace(typeof vlist); //出力:object var clip:MovieClip = new ballMC(); trace(typeof clip); //出力:object
タイプを比較するには==、!=といった演算子を使って行います。値がストリングであることに注意します。
[:sample:] typeofTest-2.fla
例:var vlist:Array = [250, -30, 2.5, "red"]; var i:int; var cnt:uint = vlist.length; for (i=0; i
[:note:]
ActionScript 3.0ではinstanceof演算子を使わず、is演算子を使ってデータ型の比較を行います。
■データ型の変換と換算 ストリングを数値に変換したり、逆に数値をストリングに変換したいといった場合があります。値を数値に変換するにはint()、uint()、Number()、そして、parseInt()、parseFloat()といった関数を利用できます。 int()は値を整数に、uint()は値を符号なし整数に、Number()は値を数値にそれぞれ変換します。日付を数値に変換した場合は、1970年1月1日から起算したミリ秒数を返します。日付はint()およびuint()が扱える範囲を超えてしまうのでNumber()で変換する必要があります。
例:ストリングを数値に変換var size:String = "25.6"; var rate:String = "-3.1"; var msg1:String = ""; var msg2:String = "test"; trace(int(size), Number(size)); //出力:25 25.6 trace(int(rate), Number(rate)); //出力:-3 -3.1 trace(int(msg1), Number(msg1)); //出力:0 0 trace(int(msg2), Number(msg2)); //出力:0 NaN
次の例ではテキストフィールドnumber_fldのテキストを取り出して、それをint()で数値に変換して計算式に使っています。
[:sample:] conversion-1.fla
例:テキストフィールドの値を数値計算に使うvar total:int; var price:int = 250; total = price * Number(number_fld.text); trace(total);
BooleanクラスやDateクラスの値を数値に変換すると次のようになります。
例:Booleanを数値に変換var state1:Boolean = true; var state2:Boolean = false; trace(int(state1), Number(state1)); //出力:1 1 trace(int(state2), Number(state2)); //出力:0 0
例:日時を1970.1.1からのミリ秒数に変換var now:Date = new Date(); trace(Number(now)); //出力:1170833832176
例:nullを数値に変換var no:Object = null; trace(int(no), Number(no)); //出力:0 0
parseInt()はストリングを整数に変換し、parseFloat()はストリングを数値に変換する関数です。なお、"0x10"、"0xFFFF"のように0x(数字の0と小文字のx)からはじまるストリングは16進数の数値として扱われます。
[:sample:] parseInt.fla
例:ストリングを整数に変換trace(parseInt("25.6")); //出力:25 trace(parseFloat("25.6")); //出力:25.6 trace(parseInt("-3.1")); //出力:-3 trace(parseInt("")); //出力:NaN trace(parseInt("0x10")); //出力:16 trace(parseInt("0xFFFF")); //出力:65535
[:note:]
ActionScript 2.0までは"056"のように0(数字の0)から始まるストリングを8進数の数値としていましたが、ActionScript 3.0からは8進数として扱いません。
parseInt()は変換する元の数が何進数の数なのかを第2引数で指定できます。進数の底は2〜36で指定します。初期値は0で10進数です。
例:2進数、16進数の値を整数に変換trace(parseInt("11", 2)); //出力:3 trace(parseInt("FF", 16)); //出力:255
数値をストリングに変換するにはString()またはNumber.toString()を使います。たとえば、次の例では数値のpriceを次のようにテキストフィールドに入力しようとしてもエラーになります。
例:フィールドのtextプロパティに数値を設定できないvar price:int = 350; price_fld.text = price;// エラーになる
このような場合は、String()を使ってストリングに変換してtextプロパティに設定します。
[:sample:] string-1.fla
例:var price:int = 350; price_fld.text = String(price);
Number.toString()を使えば値を16進数表記にするといったことができます。次のスクリプトは10進数の数値を16進数表記のストリングに変換しています。変換後の値は数値ではなくストリングである点に注意が必要です。
例:var color:Number = 13172512; trace(color.toString(16)); //出力:c8ff20
この値を16進数の数値として扱いたい場合には、次のように"0x"を連結して数値に変換し直す必要があります。
例:16進数の数値に変換するvar color:Number = 13172512; var colorHex:uint = Number("0x"+color.toString(16));
■データ型のキャスト
データ型の不一致に対処するために、データ型を強制的に変換したい場合があります。これをキャストと呼び、as演算子またはクラス関数を使って行うことができます。
たとえば、次の例1のスクリプトではインスタンスのmy_mc.rootの値がDisplayObjectタイプなので、これをMovieClipタイプに指定してあるmy_containerに入れようとすると型が一致せずにエラーになります。
例1:エラーになる場合var my_container:MovieClip; my_container = my_mc.root;
このような場合に、次の例2、例3ようにmy_mc.rootをMovieClipタイプにキャストするとエラーを回避できます。
例2:as演算子を使ってデータ型を変換するvar my_container:MovieClip; my_container = my_mc.root as MovieClip;
例3:クラス関数を使ってデータ型を変換するvar my_container:MovieClip; my_container = MovieClip(my_mc.root);
データ型の変換はストリングで与えられたクラス名からクラスを参照するという場合にも有効な手段になります。次の例は配列からストリングの状態のクラス名を取り出し、getDefinitionByName()で作った参照先をClass型に変換しています。これによって、new ClassReference()はnew cat()を実行するのと同じ操作になります。
例:catシンボルからムービークリップインスタンスを作るvar className:String = ["cat", "dog"][0]; ClassReference = getDefinitionByName(className) as Class; var mc:MovieClip = new ClassReference();
(シンボルからインスタンスを作る→P.??)■データ型のキャスト
データ型の不一致に対処するために、データ型を強制的に変換したい場合があります。これをキャストと呼び、as演算子またはクラス関数を使って行うことができます。
たとえば、次の例1のスクリプトではインスタンスのmy_mc.rootの値がDisplayObjectタイプなので、これをMovieClipタイプに指定してあるmy_containerに入れようとすると型が一致せずにエラーになります。
例1:エラーになる場合var my_container:MovieClip; my_container = my_mc.root;
このような場合に、次の例2、例3ようにmy_mc.rootをMovieClipタイプにキャストするとエラーを回避できます。
例2:as演算子を使ってデータ型を変換するvar my_container:MovieClip; my_container = my_mc.root as MovieClip;
例3:クラス関数を使ってデータ型を変換するvar my_container:MovieClip; my_container = MovieClip(my_mc.root);
データ型の変換はストリングで与えられたクラス名からクラスを参照するという場合にも有効な手段になります。次の例は配列からストリングの状態のクラス名を取り出し、getDefinitionByName()で作った参照先をClass型に変換しています。これによって、new ClassReference()はnew cat()を実行するのと同じ操作になります。
例:catシンボルからムービークリップインスタンスを作るvar className:String = ["cat", "dog"][0]; ClassReference = getDefinitionByName(className) as Class; var mc:MovieClip = new ClassReference();
(シンボルからインスタンスを作る→P.??)