2010-03-05 26 views

cevap

32

Bir AS3 sözlüğünün boyutunu/uzunluğunu/sayısını almak için yerleşik bir yöntem yoktur. Geçici çözümler vardır: Örneğin, sayaç işlevini ekleyerek flash.utils.Dictionary sınıfını genişleten veya saran özel bir sözlük sınıfı oluşturabilirsiniz. Sen girişleri eklendi/kaldırılır olarak sayar yönetebilir veya döngü yineleme için basit kullanarak on-demand güvenebilirsiniz:

public static function countKeys(myDictionary:flash.utils.Dictionary):int 
{ 
    var n:int = 0; 
    for (var key:* in myDictionary) { 
     n++; 
    } 
    return n; 
} 
+1

Çok kötü, bir sarmalayıcı oluşturmak zorunda kaldı. –

+47

Bunu yapmak için Adobe'u küçümsemek için nereye başvurabilirim? –

+1

Döngüleri önlemek için Döngüler için, yani bir Dizi üzerinde döngü yaparken ne olur? – Brilliand

0

Bir ideal olarak sadece Proxy sınıfını genişleten Sözlük etrafında sarıcı uygulamaya koyacak. Bu, yeni Sözlük sınıfının tam olarak aynı sözdizimini ve yeteneklerini kullanarak yeni Sözlük sınıfının orijinal olarak kullanılmasına olanak tanıyarak, ekleme ve geri alma işlemlerini geçersiz kılmanıza ve engellemenize olanak tanır. anahtarlar.

Bu uygulama aşağıdaki gibi çalışır. Bir özellik ayarlandığında veya silindiğinde, mülkün zaten mevcut olup olmadığını (tam olarak tanımsız olarak eşit olup olmadığını) kontrol eder ve dahili uzunluk sayacını buna göre artırır veya azaltır. Bu uygulama ayrıca, değeri tutarlılık için tanımlanmamış olarak ayarlandığında bir girişi otomatik olarak siler.

Sadece bu soru için bu Sözlük paketini yazdım; Yaklaşık 5 dakika sürdü ve uzunluğu döndüren bir uzunluk işlevi sağlar. Bir mülk yerine bir işlev yapmayı tercih ettim, bu nedenle mülk adlarını veya sözlük özelliklerinin numaralandırmasını engellemez.

BU UYGULAMAYI KULLANMAYIN; IT INSTEAD İLE İLGİLİ BİR ŞEKİLDE KULLANIN. Nedenini neden açıklarım.

package flos.utils 
{ 
    import flash.utils.flash_proxy; 
    import flash.utils.Proxy; 

    public class Dictionary extends Proxy 
    { 
     private var d:flash.utils.Dictionary; 
     private var _length:int = 0; 

     public function Dictionary(weakKeys:Boolean = false) 
     { 
      d = new flash.utils.Dictionary(weakKeys); 
     } 

     public function length():int 
     { 
      return _length; 
     } 

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

     override flash_proxy function setProperty(name:*, value:*):void 
     { 
      if (value === undefined) //delete property when explicitly set to undefined, to enforce rule that an undefined property does not exist and is not counted 
      { 
       delete this[name]; 
       return; 
      } 
      if (d[name] === undefined) 
       _length++; 
      d[name] = value; 
     } 

     override flash_proxy function deleteProperty(name:*):Boolean 
     { 
      if (d[name] !== undefined) 
      { 
       delete d[name]; 
       _length--; 
       return true; 
      } 
      return false; 
     } 
    } 
} 

YASAL UYARI: Yukarıdaki uygulama, sözlük Vekil arayüz yöntemlerine tümüyle ihlal olduğu teoride çalışmış olabilir en umut verici yaklaşım, sonuçta bir çıkmaz olmasına rağmen.

İlk

, setProperty, getProperty ve deleteProperty yöntemleri türsüz name parametreleri almak üzere görünür, ancak bunlar şiddetle esasen sadece Object ve ortak Diziler gibi String tip adlarına anahtarlarınızı kısıtlamak QName nesneler, daktilo aslında. Dictionary, bu sınırlama ile sınırlı değildir ve nesne örneklerini benzersiz anahtarlar olarak kullanmanıza olanak tanır, bu nedenle de, doğal olarak Proxy sınıfı yöntemleriyle uyumsuzdur. Sözlük sınıfının belgelerinin de tek bir notu vardır ve açıkça QName nesnelerinin anahtar olarak kullanılamayacağını belirtir. o String bir kuvvetle tipi dönüş değeri vardır çünkü

Aynı şekilde, Proxy nextName yöntem, aynı nedenle tüm Dictionary anahtarlarını numaralandırılırken engeller. Bu nedenle, setProperty, getProperty, adlar için yazılmamış anahtarlar gerçekten kabul ettiyse bile, nextName yöntemi yalnızca tür dizgisi döndürdüğü için numaralandırma yoluyla bunları geri alamazsınız. Dictionary sadece kendi sınıfındadır.

Yapabileceğiniz en iyi şey, numaralandırma için altta yatan sözlüğü ortaya çıkaran, yukarıdaki gibi bir sarmalayıcı uygulamaktır, ancak diğerleri, Proxy davranışını kullanmak yerine, açıklanmamış adlar ve değerler içeren açık addKey/removeKey yöntemlerini çağırmayı gerektirir.

şöyle böyle getValue/setValue/removeValue gibi yöntemleri çağırarak sözlüğü manipüle ve tuşlar numaralandırma erişimi yanı sıra bir length özelliğine sahip olduğu Yukarıdakilerin hepsi, daha iyi bir uygulama olacağını göz önüne alındığında:

public class Dictionary 
{ 
    private var d:flash.utils.Dictionary; 
    private var _keys:Array; 

    public function Dictionary(weakKeys:Boolean = false) 
    { 
     d = new flash.utils.Dictionary(weakKeys); 
     _keys = new Array(); 
    } 

    public function get keys():Array 
    { 
     return _keys.concat(); //return copy of keys array 
    } 

    public function get length():int 
    { 
     return _keys.length; 
    } 

    public function containsKey(key:*):Boolean 
    { 
     return d[key] !== undefined; 
    } 

    public function setValue(key:*, value:*):void 
    { 
     if (value === undefined) //delete property when explicitly set to undefined, to enforce rule that an undefined property does not exist and is not counted 
     { 
      removeValue(key); 
      return; 
     } 
     if (d[key] === undefined) 
     { 
      _keys.push(key); 
     } 
     d[key] = value; 
    } 

    public function getValue(key:*):* 
    { 
     return d[key]; 
    } 

    public function removeValue(key:*):Boolean 
    { 
     if (d[key] !== undefined) 
     { 
      delete d[key]; 
      var i:int = _keys.indexOf(key); 
      if (i > -1) 
       _keys.splice(i, 1); 
      return true; 
     } 
     return false; 
    } 
0

Sen DictionaryUtil kullanabilirsiniz:

var dictionaryLength : int = DictionaryUtil.getKeys(d).length;