1

カスタム クラスのプロパティを繰り返し処理しようとしていますが、アドビが提供するメソッドが機能していないようです。コンパイル エラーまたは実行時エラーが発生しません。

クラス

package {   
    public dynamic class enum {
        public var foo:Number = 123;

        public function enum() {
            this.setPropertyIsEnumerable("foo", true);
            if (this.propertyIsEnumerable("foo") == false) {
                trace("foo:" + foo + " is not enumerable.")
            }
        }
    }
}

// outputs "foo:bar is not enumerable."

実装

var test:enum = new enum();
for (var property:String in test) {
    trace(property);
}

// outputs nothing

私は自分のコードを高速かつ柔軟に保つように努めているためfor ... in、プロパティで使用できるようにするためだけにクラスを Dynamic に変更する必要がある場合は、本当にイライラします。 Jackson Dunstan のテストでは、これは static class properties よりも 400 倍遅くなる可能性があることが確認されていますが、それらを明示的に参照する (プロパティに依存しないメソッドには非現実的) か、クラスのリフレクション (計算コストが高い) を使用してアクセスできるようにする必要があります。

問題全体を回避するために私が見つけた唯一の方法は、動的に宣言された変数を使用することです...その時点で setPropertyIsEnumerable(prop, true) を使用することは不要であるため、これは無意味です。動的に作成されたすべてのプロパティはすでに列挙可能です。さらに、動的変数は厳密にデータ型を指定することができず、パフォーマンスが低下します。

例えば...

クラス

package {   
    public dynamic class enum {
        public var foo:String = "apple";

        public function enum(){
            this.dynamicVar = "orange";
            this.dynamicProp = "banana";
            this.setPropertyIsEnumerable("foo", true);
            this.setPropertyIsEnumerable("dynamicProp", false);
        }
    }
}

実装

var test:enum = new enum();
for (var key:String in test) {
    trace(key + ": " + test[key]); // dynamicVar: 1
}

// outputs "dynamicVar: orange"

クラスが動的になったので、3 つのテスト プロパティのうち 1 つだけが反復されていることがわかります。2 があるはずです。

アドビはプログラミングの悪い習慣を私たちに取り入れさせようとしているように思えます。何と言ってよいのかわからない...

4

1 に答える 1

1

非動的クラスは、列挙可能なプロパティまたはメソッドを提供しません。

あなたが提供したリンクの説明に記載されているとおりです。

ループ操作の動的プロパティの可用性を設定します。

このアプローチでコードをリファクタリングしたいと思うかもしれません。あなたがここでやっているように、クラスのプロパティをループする必要はありませんでした。アイテムを動的に追跡したい場合は、連想配列を使用して、あなたがやっているようにクラスレベルではなく、そのように追跡する必要があります。
また、強力なデータ型付けが必要な場合は、ベクターを使用してください。

于 2013-07-22T19:30:35.800 に答える