2012-07-26 11 views
9

estoy tratando de encontrar una manera de inicializar una línea Diccionario en ActionScript 3, como:Diccionario de inicialización en línea en AS3

private var sampleDic:Dictionary = new Dictionary (
    { "zero", "Hello" }, 
    { "one", "World" } 
); 

He intentado muchas maneras, pero ninguno funciona. Alguien sabe si es posible, y ¿cómo?

Gracias

Respuesta

8

No, no puede hacerlo. Tienes que construir un diccionario y luego agregar los valores en un bucle o individualmente.

+0

suspiro, estaba miedo de eso, gracias – Daniele

0

Si no hay un motivo específico para usar un diccionario, puede hacerlo con un objeto.

private var sample:Object = { 
    "zero": "Hello", 
    "one": "World" 
}; 
+1

La sintaxis no es correcta. Lo he corregido pero aún no aparece. De todos modos, esto funcionará bien cuando las claves sean cadenas, pero no para ningún otro tipo. Dado el ejemplo en la pregunta, probablemente las cadenas sean suficientes. –

+0

Gracias, pero no. Usé un ejemplo simple, pero en realidad necesito claves que no son cadenas – Daniele

4

Si quieres realmente algo por el estilo, se puede utilizar una fábrica Diccionario:

public class DictFactory 
    { 
     public var dict:Dictionary; 
     public function create(obj:Object):Dictionary 
     { 
      dict = new Dictionary(); 

      for (var key:String in obj) { 
       dict[key] = obj[key]; 
      } 

      return dict; 
     }   
    } 

Uso:

private var sampleDic:Dictionary = new DictFactory().create({ "zero":"Hello", "one": "World" }); 

El DictFactory.create espera un objeto con valores clave, que la voluntad se aplicará al Diccionario devuelto, si pasa cualquier otro objeto (en AS3, cualquier clase es Objeto), los resultados pueden ser indeseados. :)

+0

No pensé en eso, muchas gracias. De hecho, necesito objetos como llaves, pero puedo manejar algo así que les permita. – Daniele

+0

En mi ejemplo, puede usar cualquier objeto como clave o valores –

+0

Ow, tiene usted razón. Lo siento, pasé los últimos meses usando C# y ahora mi mente está elaborando nuevas limitaciones no existentes para ActionScript. Gracias de nuevo. – Daniele

2

Puede ampliar la clase del diccionario y anular el constructor predeterminado con uno que acepte peras iniciales con valor-clave.

EDIT:

También puede utilizar este JS sucios como solución :)

import flash.utils.Dictionary; 

var dict : Dictionary = function (d : Dictionary, p : Object) : Dictionary { for (var i : String in p) { d[i] = p[i] }; return d; }(new Dictionary(), { 
    "zero": "Hello", 
    "one": "World" 
}) 

trace(dict["zero"]); 
+0

Bien, eso es pensar fuera de la caja. ¿Disminuye la velocidad de las cosas o cualquier cosa, o básicamente es igual de eficiente? – Panzercrisis

+0

No sentirá el impacto en el rendimiento si no ejecuta en muy poco tiempo (miles de veces por fotograma :)). El problema con este enfoque es que solo puede usar cadenas para las claves. Eso significa que no obtienes funcionalidad adicional de Object. Entonces, una cosa mejor es crear una envoltura o una clase de fábrica alrededor de Dictionary. –

6

Si es estática que puede hacer esto con un bloque

private static var myDict:Dictionary = new Dictionary(); 
{ 
    myDict["zero"] = "Hello"; 
    myDict["one"] = "World"; 
} 
+1

¿Es este tipo de cosas un tema común entre los lenguajes orientados a objetos? Nunca he visto algo así, excepto por la primera línea. – Panzercrisis

Cuestiones relacionadas