BeInteractive!

for..inループの仕様変更と、describeTypeメソッドについて

for..inループの仕様変更

ActionScript2まではfor..inループでクラスメンバを列挙することが出来ましたが、ActionScript3では、dynamicなクラスにおいて、後から追加されたプロパティやメソッドしか列挙しないように変更されています。

次の例では、コンソールには何も出力されません。

class SomeClass
{
 public var propertyA:uint = 1;
 public var propertyB:uint = 2;
}
var someClass:SomeClass = new SomeClass();

for(var key:String in someClass)
{
 trace(key);
}

次の例では、propertyCのみが出力されます。

dynamic class SomeClass
{
 public var propertyA:uint = 1;
 public var propertyB:uint = 2;
}
var someClass:SomeClass = new SomeClass();
someClass.propertyC = 3; // 新しいプロパティを作成

for(var key:String in someClass)
{
 trace(key); // 出力 : propertyC のみ
}

予め定義されたクラスメンバを列挙したい場合は、新しく追加されたdescribeTypeメソッドを使用します。

describeTypeメソッド

上記の仕様変更に伴い、新しくflash.utilパッケージにdescribeTypeメソッドが追加されました。

これは、インスタンスに関する詳細な情報を返すメソッドで、クラス名やdynamic/final/static、メンバや引数などを取得できます。

結果はXML形式なので、E4Xを使用して柔軟な操作が可能です。次の例では、someObjectのクラスが持つメソッドの名前を全て列挙します。

import flash.util.describeType;

for each(var method:XML in describeType(someObject)..method)
{
 trace(method.@name);
}

ちなみに、どのような形式のXMLが返ってくるかは、

trace(describeType(someObject).toXMLString());

と、XMLを実際にコンソールに表示してみると参考になるでしょう。

この記事へのトラックバック

トラックバックはありません。

TrackBack URL:

http://www.be-interactive.org/trackback.php?id=26

この記事へのコメント

コメントはありません。

コメント書き込み:

カテゴリ

タグ

アーカイブ