2010-03-06 1 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 закрытия так:

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

Имеет ли AS3 что-то подобное?

Благодаря

ответ

24

Нет AS3 не не имеет перечисление, вы должны закодировать их самостоятельно. Вы можете моделировать их, например, в классе, если вы хотите более безопасной проверки типов:

+1

Мне нравится метод Скотта Биласа. –

+0

Реализация метода Биласа от Cardin @ github: https://gist.github.com/cardin/1066674 –

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 или coerce опкоды использовали бы getlocal_i и coerce_i, соответственно.)

Формат ABC не имеет встроенного в положение для типов перечислений, которые я знаю.

Используя тип объекта для каждого значения перечисления может работать, особенно если компилятор генерирует coerce инструкции для данного типа до использования getlocal и иным образом не использует объект другой, чем в istype и astype вариантов. Например, вызов setproperty или getproperty на объект будет медленнее, чем использование целого числа - особенно если это свойство связано с методом getter или setter.

Есть стили замены, которые были связаны в других ответах. Чтобы оценить влияние производительности этих стилей на производительность выполнения, вы можете использовать swfdump -D из коллекции инструментов Flash с открытым исходным кодом swftoools.

+0

Благодарим вас за подробное объяснение. –

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