2010-03-06 85 views
21

有沒有辦法像我們在其他語言中那樣定義AS3中的枚舉?我可以用如下定義的值定義常量:如何在as3中定義枚舉?

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

等等。如果我要插入3之間的一些其他不變,這些我需要移動所有的值這樣的:

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

而在其他語言,我會最終只增加一個新成員,以枚舉封這樣的:

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

AS3是否有類似的東西?

謝謝

回答

10

你可以看看各種受支持的變量類型ActionScript虛擬機。變量類型由特質註釋,品種,其中可在specification發現,表4.8.1:

 
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 

沒有Trait_Enum並注意下Trait_Const介紹,從常量池中唯一不變是允許的,所以這將是:

  • 符號整數
  • 無符號整數
  • 雙打
  • 類型名稱和矢量類型

枚舉可以由符號或無符號整數,例如,但虛擬機將不執行其使用的操作的任何類型的安全檢查這些類型。 (例如,用於將分別爲getlocal_icoerce_i。在getlocalcoerce操作碼)

的ABC格式沒有爲我所知道的枚舉類型的任何內置的規定。

使用每個枚舉值的對象類型可以工作,尤其是如果編譯器發出coerce指令的getlocal用途之前該類型以及以其他方式不使用比istypeastype變體等的對象。例如,在對象上調用setpropertygetproperty將比使用整數慢 - 特別是如果該屬性綁定到getter或setter方法。

有其他答案中有鏈接的替換樣式。要評估這些樣式的運行時性能影響,您可以使用swftoools開源Flash工具集合中的swfdump -D

+0

感謝您的詳細解釋。 – 2010-03-08 06:43:38

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++;