« 2.3 フレームアクションの関数定義とメソッド定義 | メイン | スプリングsample »

2.4 データ型

■データ型の指定(型注釈)
変数や関数の戻り値にデータ型(データタイプ)を指定できます。データ型には取り得る値の属性や範囲を指定してあります。たとえば、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と置き換えられます。

例:データ型指定なしで変数を宣言する
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.??)

About

2007年5月12日 08:13に投稿されたエントリーのページです。

ひとつ前の投稿は「2.3 フレームアクションの関数定義とメソッド定義」です。

次の投稿は「スプリングsample」です。

他にも多くのエントリーがあります。メインページアーカイブページも見てください。