2010-03-06 4 views
21

Gibt es eine Möglichkeit, eine Enum in AS3 in einer Weise zu definieren, wie wir es in anderen Sprachen machen? Ich kann Konstanten definieren mit definierten Werten wie das:Wie definiere ich enum in as3?

private const CONST_1:int = 0; 
private const CONST_2:int = 1; 
private const CONST_3:int = 2; 

und so weiter. Wenn ich eine andere Konstante zwischen 3 eingefügt werden soll diese brauche ich alle Werte so bewegen:

private const CONST_1:int = 0; 
private const CONST_2:int = 1; 
private const CONST_2A:int = 2; 
private const CONST_3:int = 3; 

während in einer anderen Sprache würde ich nur am Ende ein neues Mitglied hinzugefügt Schließung wie das ENUM:

enum { 
    CONST_1 = 0, 
    CONST_2, 
    CONST_2A, 
    CONST_3 
} MyConstEnum; 

Hat AS3 etwas ähnliches?

Dank

Antwort

10

Sie einen Blick auf die Vielzahl von Variablen-Typen nehmen unterstützt durch die ActionScript-virtuelle Maschine. Variablentypen sind mit Anmerkungen versehen von Zügen, die Vielfalt von denen in den specification, Tabelle 4.8.1 zu finden:

 
4.8.1 Summary of trait types 
The following table summarizes the trait types. 

Type   Value 
Trait_Slot  0 
Trait_Method  1 
Trait_Getter  2 
Trait_Setter  3 
Trait_Class  4 
Trait_Function 5 
Trait_Const  6 

Es gibt keine Trait_Enum und beachten Sie, dass unter Trait_Const Beschreibung nur Konstanten aus dem konstanten Pool sind erlaubt, so dass wäre:

  • unterzeichneten ganze Zahlen
  • ganze Zahlen ohne Vorzeichen
  • verdoppelt
  • Saiten
  • Typnamen und Vektortypen

Aufzählungen von mit oder ohne Vorzeichen ganze Zahlen vorgenommen werden könnten, zum Beispiel, aber die virtuelle Maschine jeder Art-Sicherheitsüberprüfung der Operationen nicht durchführen würde, die verwendet diese Arten. (Zum Beispiel des getlocal oder coerce Opcodes verwendet würde getlocal_i und coerce_i, respectively.)

Das ABC-Format hat keine eingebaute in Bereitstellung für Aufzählungstypen, die ich kenne.

einen Objekttyp für jeden Enum-Wert verwenden könnte funktionieren, vor allem, wenn der Compiler coerce Anweisungen für diese Art vor der Verwendung von getlocal emittiert und ansonsten das Objekt nicht verwenden, anders als in istype und astype Varianten. Beispielsweise wäre das Aufrufen von setproperty oder getproperty für das Objekt langsamer als die Verwendung einer Ganzzahl - insbesondere, wenn diese Eigenschaft an eine Getter- oder Setter-Methode gebunden ist.

Es gibt Ersatz Stile, die in anderen Antworten in Verbindung gebracht wurden. Um die Auswirkungen dieser Stile auf die Laufzeitleistung zu bewerten, können Sie swfdump -D aus der Open-Source-Tool-Sammlung swftoools verwenden.

+0

Vielen Dank für ausführliche Erklärung. –

11
public static var NUM_ENUM_VALUES:int = 0; 
public static const EV_MONDAY:int = NUM_ENUM_VALUES++; 
public static const EV_TUESDAY:int = NUM_ENUM_VALUES++; 
public static const EV_WEDNESDAY:int = NUM_ENUM_VALUES++; 
public static const EV_THURSDAY:int = NUM_ENUM_VALUES++;