Оператор enum
Объявляет имя перечисляемого типа данных и имена членов перечисления.
[modifiers] enum enumName [ : typeAnnotation]{
enumValue1 [ = initializer1]
[,enumValue2 [ = initializer2]
[, ... [,enumValueN [ = initializerN ] ]]]
}
Аргументы
modifiers
Необязательный. Модификаторы, которые управляют видимостью и поведением перечисления.enumName
Обязательный. Имя перечисляемого типа.typeAnnotation
Необязательный. Базовый тип данных перечисления. Должен быть целочисленным типом данных. По умолчанию используется тип int.enumValue1, enumValue2, ..., enumValueN
Необязательный. Член перечисляемого типа.initializer1, initializer2, ..., initializerN
Необязательный. Константное выражение, которое переопределяет числовое значение члена перечисления, используемое по умолчанию.
Заметки
Объявление enum вводит в программу новый тип перечисляемых данных. Объявление enum может появляться только в контексте, в котором можно объявлять класс, то есть в глобальной области, в области пакета или в области класса, но не в функции или методе.
Базовый тип перечисления можно объявить как целочисленный тип данных (int, short, long, byte, uint, ushort, ulong или sbyte). Члены перечисления неявно приводятся к этому типу данных, что позволяет напрямую назначать числовые данные переменным, принадлежащим типу enum. По умолчанию базовым типом данных является тип int.
Каждый член перечисляемого типа имеет имя и необязательный инициализатор. Инициализатор должен представлять собой константное выражение времени компиляции, тип которого совпадает с типом указанного перечисления или может быть приведен к этому типу. Значение первого члена перечисляемого типа равно нулю или значению инициализатора, если он предоставлен. Значение каждого следующего члена перечисляемого типа на единицу больше значения предыдущего члена или равно значению инициализатора, если он предоставлен.
Способ получения доступа к значению enum аналогичен доступу к члену статического класса. Имя члена должно дополняться именем перечисления, например Color.Red. При присвоении значения переменной типа enum, следует использовать следующее: полное имя (например, Color.Red), строковое представление имени (например, "Red") или числовое значение.
Если переменной enum присваивается строка, которая известна во время компиляции, компилятор выполнит необходимое преобразование. Например, строка "Red" будет заменена на Color.Red. Если строка неизвестна во время компиляции, преобразование будет выполнено во время выполнения. Если строка не является допустимым членом перечисляемого типа, преобразование может завершиться неудачей. Поскольку для преобразования требуется время, а кроме того, могут возникать ошибки времени выполнения, старайтесь избегать присвоения типа enum строковой переменной.
Переменная перечисляемого типа может содержать значения за пределами диапазона объявленных значений. Эту возможность можно использовать, в частности, для создания комбинации членов, используемых в качестве битовых флагов, как показано в представленном ниже примере. При преобразовании переменной enum в строку создается строковое представление имени члена.
Пример 1
В следующем примере показано поведение перечислений. В нем объявляется простое перечисление с именем CarType, содержащее члены Honda, Toyota и Nissan.
enum CarType {
Honda, // Value of zero, since it is first.
Toyota, // Value of 1, the successor of zero.
Nissan // Value of 2.
}
// Declare a variable of type CarType, and give it the value Honda.
var myCar : CarType = CarType.Honda;
print(int(myCar) + ": " + myCar);
myCar = "Nissan"; // Change the value to "Nissan".
print(int(myCar) + ": " + myCar);
myCar = 1; // 1 is the value of the Toyota member.
print(int(myCar) + ": " + myCar);
Результаты выполнения данного кода следующие.
0: Honda
2: Nissan
1: Toyota
Пример 2
В следующем примере показано, как использовать перечисление, содержащее битовые флаги. При этом переменная enum может не содержать явно значения в списке членов. В примере определяется перечисление FormatFlags, которое используется для изменения поведения функции Format.
// Explicitly set the type to byte, as there are only a few flags.
enum FormatFlags : byte {
// Can't use the default values, since we need explicit bits
ToUpperCase = 1, // Should not combine ToUpper and ToLower.
ToLowerCase = 2,
TrimLeft = 4, // Trim leading spaces.
TrimRight = 8, // Trim trailing spaces.
UriEncode = 16 // Encode string as a URI.
}
function Format(s : String, flags : FormatFlags) : String {
var ret : String = s;
if(flags & FormatFlags.ToUpperCase) ret = ret.toUpperCase();
if(flags & FormatFlags.ToLowerCase) ret = ret.toLowerCase();
if(flags & FormatFlags.TrimLeft) ret = ret.replace(/^\s+/g, "");
if(flags & FormatFlags.TrimRight) ret = ret.replace(/\s+$/g, "");
if(flags & FormatFlags.UriEncode) ret = encodeURI(ret);
return ret;
}
// Combine two enumeration values and store in a FormatFlags variable.
var trim : FormatFlags = FormatFlags.TrimLeft | FormatFlags.TrimRight;
// Combine two enumeration values and store in a byte variable.
var lowerURI : byte = FormatFlags.UriEncode | FormatFlags.ToLowerCase;
var str : String = " hello, WORLD ";
print(trim + ": " + Format(str, trim));
print(FormatFlags.ToUpperCase + ": " + Format(str, FormatFlags.ToUpperCase));
print(lowerURI + ": " + Format(str, lowerURI));
Результаты выполнения данного кода следующие.
12: hello, WORLD
ToUpperCase: HELLO, WORLD
18: %20%20hello,%20world%20%20