如何在AS3中定义枚举?

22

有没有一种在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有类似的东西吗?

谢谢

3个回答

26

AS3没有枚举,你需要自己编写代码来实现它们。如果您想要更安全的类型检查,可以通过类来模拟它们。


1
我喜欢Scott Bilas的方法。 - Heath Hunnicutt
从Cardin@github的https://gist.github.com/cardin/1066674实现了Bilas方法。 - Ross Attrill

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

11
你可以查看ActionScript虚拟机支持的各种变量类型。变量类型由“特性”注释,其种类可以在规范表4.8.1中找到:
4.8.1 特征类型总结 以下表格总结了特征类型。
类型 值 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”或“coerce”操作码将分别为“getlocal_i”和“coerce_i”。)
我不知道ABC格式中是否有任何内置的枚举类型提供。
使用每个枚举值的对象类型可能有效,特别是如果编译器在使用getlocal之前对该类型发出coerce指令,并且除了在istypeastype变体中使用对象之外不使用该对象。例如,在对象上调用setpropertygetproperty将比使用整数慢-特别是如果该属性绑定到getter或setter方法。

已在其他答案中链接了替代样式。要评估这些样式的运行时性能影响,可以使用swftoools开源Flash工具集中的swfdump -D


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接