如何使AS3一个用户自定义对象的Iterable(How to make an user defin

2019-10-18 06:49发布

我需要通过一个用户定义的对象的所有属性进行迭代。 如何使AS3对象可迭代? (我想使用的为...每个循环)。

我试图扩大代理。

但不知道实现这个什么方法。

下面是我的课,

[Bindable]
public class XYZ extends Proxy
{
    public var aggTerRedQty:String;

    public var aggNBPQtyUsrs:String;

    public var termAllocUnloadQty:String;

    public var effNomQty:String;

    public var termAllocSplitFirm:String;

}

谢谢

Answer 1:

[编辑]

我的代码以支持犯了一个错误for each循环中,编辑要解决这个问题。

基于对用于文档的Proxy类 ,我刮起了这个例子。 我从来没有这样做,并实施似乎有点奇怪。 但是这个代码主要是从文档,和它的工作原理:您可以使用for each环或for in环上的扩展类Proxy

主类:

package 
{ 
    import flash.display.Sprite; 

    public class Main extends Sprite  
    { 
        public function Main():void 
        { 
            var obj:MyClass = new MyClass();

            trace("for in loop output:");
            for (var propertyName:String in obj)
            {
                trace("property: " + propertyName + "  value: " + obj[propertyName]);
            }

            trace("for each loop output:")
            for each (var item:Object in obj)
            {
                trace("current item: " + item);
            }
        } 
    } 
}

扩展级Proxy

package
{
    import flash.display.Sprite;
    import flash.utils.Proxy;
    import flash.utils.flash_proxy;

    use namespace flash_proxy;

    public class MyClass extends Proxy
    {
        protected var _target:Object = { property1: property1, property2: property2, property3: property3, property4: property4 };
        protected var _item:Array;

        public function MyClass()
        {
        }

        override flash_proxy function nextNameIndex (index:int):int { 
            // initial call
            if (index == 0)
            {
                _item = new Array();
                for (var x:* in _target)
                {
                    _item.push(x);
                }
            }
            if (index < _item.length)
            {
                return index + 1;
            }
            else
            {
                return 0;
            }
        }

        override flash_proxy function nextName(index:int):String
        {
            return _item[index - 1];
        }

        override flash_proxy function nextValue(index:int):*
        {
            return _target[ _item[index -1] ];
        }

        override flash_proxy function getProperty(name:*):*
        {
            return _target[name];
        }


        public var property1:String = "Hi";
        public var property2:Boolean = true;
        public var property3:Object = { a: 1, b: false };
        public var property4:Sprite;
    }
}

控制台输出:

for in loop output:
property: property2  value: true
property: property4  value: null
property: property1  value: Hi
property: property3  value: [object Object]
for each loop output:
current item: true
current item: null
current item: Hi
current item: null

在文档的进一步审查,一个现实的实现的Proxy类很可能还需要实现的Proxy类的setProxy()方法为好。



Answer 2:

最简单的办法 - 创建数组或向量或字典,如果你想通过名称访问,与属性填充它,在类,将通过阵列/矢量/字典迭代创建一个函数。

例:

public class Example
{
  public var _properties:Vector.<String>; //this can be Dictionary or Array, depends what you need it for

 public function Example()
 {
   _properties = new Vector.<String>;
   _propertis.push(property1, property2, ...);
 }

 public function findProperty(someCondition:String):String
 {
   for(var i:int = 0; i < _properties.length;i++)
   {
     if(_propertis[i] == someCondition) return _properties[i];
   }
 }
}


文章来源: How to make an user defined Object Iterable in AS3