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 です。
列挙型メンバーには、それぞれ名前と省略可能な初期化子があります。 初期化子は、指定した列挙型と同じ型、またはその型に変換可能な、コンパイル時の定数式である必要があります。 列挙型の最初のメンバーの値が指定されている場合、その値は 0 または初期化子の値です。 以降のメンバーの値が指定されている場合、その値は、直前のメンバーより 1 大きい値か、初期化子の値になります。
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