Dictionaryクラス(dynamic) |
パッケージ
|
flash.utils
|
継承
|
Dictionary → Object
|
Dictionary()コンストラクタ
|
文法
|
public function Dictionary(weakKeys:Boolean = false)
|
概要
|
Dictionaryインスタンスを生成する。
|
引数
|
weakKeys:Boolean (デフォルト = false) − キーに弱い参照を指定するときはtrue、そうでないときにはfalseを渡す。
|
説明
Dictionaryインスタンスには、オブジェクトをキーにして値が納められます。その使い途は基本的に配列やObjectインスタンスと同じで、複数の値を納める容れ物です。キーとともにエレメントを削除するには、delete演算子を用います。
実際、キーを整数にすると、配列と同じようにインデックスで値を操作できます。また、文字列がキーであれば、もちろんObjectインスタンスと同じに扱えます。けれど、Dictionaryインスタンスの最大の特長は、オブジェクトの参照をキーにできることです[*1]。
引数にtrueを渡すと、キーには弱い参照が指定されます。すなわち、キーに指定したオブジェクトに他の参照がなければ、キーのオブジェクトはガベージコレクション[*2]の対象となります。
[*1] [ヘルプ]の[ActionScript 3.0言語およびコンポーネントリファレンス]で[Dictionary]を見ると、つぎのようにキーが「識別子」となるかのように書かれています。
オブジェクトがキーとして使用されている場合は、オブジェクトの識別子を使用してオブジェクトを検索し、オブジェクトのtoString()を呼び出して返される値は使用されません。
識別子は通常、文字列として理解されるでしょう。しかし、Dictionaryインスタンスは、オブジェクトについてはその参照をキーとします。実際、英語版[ヘルプ]も、つぎのように「同じオブジェクトかどうか(identity)によって調べる」と説明しており、「識別子」(identifier)という単語は使っていません。おそらく誤訳でしょう。
When an object is used as a key, the object's identity is used to look up the object, and not the value returned from calling toString() on it.
[*2]「ガーベジコレクション」(garbage collection)とは、オブジェクトへの参照を確かめ、すべての参照がなくなるとメモリを自動的に解放する仕組みです。
また、弱い参照のリスナーについては、[ヘルプ]の「イベントリスナーの管理」の「イベントリスナーの追加」やakihiro kamijo「イベントリスナ(AS3)とガーベジコレクション」、およびgskinner.com「AS3: Weakly Referenced Listeners」(英文)をご覧ください。
|
例
以下のフレームアクション(スクリプト001)は、3つの青い矩形のSpriteインスタンスをタイムラインに配置し、それらをクリックすると、それぞれに異なるフィルタが適用されます(図001)。
スクリプト001■クリックしたインスタンスごとに異なるフィルタを適用する
// フレームアクション
var nColor:uint = 0x0000FF;
var sizePoint:Point = new Point(100,25);
var myDictionary:Dictionary = new Dictionary();
var mySprite:Sprite;
mySprite = createSprite(10,10);
myDictionary[mySprite] = new BevelFilter();
mySprite = createSprite(10,50);
myDictionary[mySprite] = new BlurFilter();
mySprite = createSprite(10,90);
myDictionary[mySprite] = new GlowFilter();
mySprite = null;
function createSprite(nX:Number, nY:Number):Sprite {
var mySprite:Sprite = new Sprite();
var myGraphics:Graphics = mySprite.graphics;
addChild(mySprite);
mySprite.addEventListener(MouseEvent.CLICK, applyFilter);
myGraphics.beginFill(nColor);
myGraphics.drawRect(0, 0, sizePoint.x, sizePoint.y);
mySprite.x = nX;
mySprite.y = nY;
return mySprite;
}
function applyFilter(eventObject:MouseEvent):void {
var mySprite:Sprite = eventObject.currentTarget as Sprite;
mySprite.filters = [myDictionary[mySprite]];
mySprite.removeEventListener(MouseEvent.CLICK, applyFilter);
}
|
図001■インスタンスをクリックするとそれぞれに異なるフィルタが適用される
|
→
|
|
*図をクリックするとwonderflのサンプルクラスが開く。
動的に生成したインスタンスには、デフォルトではインスタンス名がなく、[出力]しても区別できません。さらに、上記のサンプルスクリプトでは、変数に代入されたSpriteインスタンスの参照も破棄しています。
しかし、Dictionaryインスタンスに対しては、各Spriteインスタンスの参照をキーとしてフィルタオブジェクトを納めています。そして、クリックしたときのイベントオブジェクトから対象のインスタンスを調べ、Dictionaryインスタンスからそれがキーとされたフィルタオブジェクトを取出し、Spriteインスタンスに設定しています[*3][*4]。
[*3] Dictionaryクラスは、インスタンス同士を関連づけるときにも役立ちます。gihyo.jp連載「ActionScript 3.0で始めるオブジェクト指向スクリプティング」第32回「Dictionaryクラスを使う」では、サムネイル画像にロールオーバーすると、対応する大きい画像の表示が切替わる例をご紹介しました(図002)。具体的なサンプルスクリプトについては、解説をお読みください。
図002■サムネイルにロールオーバーすると対応する画像が切替わる
[*4] インスタンスに値やオブジェクトを関連づけるには、Objectクラスを使うやり方もあります。たとえば、DisplayObjectインスタンスであれば、DisplayObject.nameプロパティに名前をつけ、その文字列をObjectインスタンスのプロパティにして値を納めます。
けれど、Dictionaryインスタンスを使えば、DisplayObject.nameプロパティは設定しなくて済みます。それだけでなく、参照をキーにするDictionaryインスタンスの方が、文字列をプロパティとするObjectよりアクセスは速いです。ふたつの手法を簡単なスクリプトで示すと、つぎのようになります。
var myDictionary:Dictionary = new Dictionary(); // Dictionaryインスタンス生成
var myObject:Object = {}; // Objectインスタンス生成
var i:uint = 0
var _mc:MovieClip = new MovieClip();
var name_str:String = "instance" + i;
_mc.name = name_str;
_mc.id = i; // MovieClipインスタンスに変数を設定
myDictionary[_mc] = i; // Dictionaryインスタンスで参照に値を設定
myObject[name_str] = i; // Objectインスタンスで文字列のプロパティに値を設定
|
以下のwonderflのサンプルスクリプトで、アクセスの速さを比べてみました。なお、MovieClipインスタンスであれば、動的に変数が設定できます(上記スクリプト参照)。速度としては、こちらの方が勝ります。ただし、応用の範囲が広くないでしょう。
Comparing access speed to get values from the Dictionary and Object classes - wonderfl build flash online
|
参考
[ActionScript 3.0言語およびコンポーネントリファレンス] > [Dictionary]「Dictionary()コンストラクタ」
作成者: 野中文雄
更新日: 2011年1月18日 注[*3]および[*4]を追加
更新日: 2010年1月21日 キーの削除にdelete演算子が用いられる旨を追加
作成日: 2009年12月16日