enum 陳述式
更新:2007 年 11 月
宣告列舉資料型別的名稱和列舉型別的成員名稱。
[modifiers] enum enumName [ : typeAnnotation]{
enumValue1 [ = initializer1]
[,enumValue2 [ = initializer2]
[, ... [,enumValueN [ = initializerN ] ]]]
}
引數
修飾詞
選擇項。修飾詞,控制列舉型別的可視性和行為。enumName
必要項。列舉型別的名稱。typeAnnotation
選擇項。列舉型別的基礎資料型別。必須是整數類資料型別。預設為 int。enumValue1, enumValue2, ..., enumValueN
選擇項。列舉型別成員。initializer1, initializer2, ..., initializerN
選擇項。常數運算式,會覆寫列舉型別成員的預設數值。
備註
enum 宣告將新的列舉資料型別引入程式。enum 宣告只能出現在類別宣告可以出現的內容中,也就是全域範圍、套件範圍或類別範圍,但是不能出現在函式或方法中。
您可以將列舉型別的基礎型別宣告為任何整數類資料型別 (int、short、long、byte、uint、ushort、ulong 或 sbyte)。列舉成員隱含強制轉換成基礎資料型別或從基礎資料型強制轉換,允許數值資料可以直接設定給 enum 型別變數。根據預設,列舉型別的基礎資料型別是 int。
每個列舉型別成員都有一個名稱和選擇性 (Optional) 初始設定式。初始設定式必須是編譯時期常數運算式,此運算式與指定列舉型別有相同型別,或是可以轉換成此型別。第一個列舉型別成員的值是零或初始設定式的值 (如果有提供)。接下來的每個列舉型別成員的值會比先前的成員或初始設定式的值 (如果有提供) 多一。
存取 enum 值的方式類似於存取靜態類別成員。成員的名稱必須以列舉型別的名稱來限定,例如 Color.Red。將值指派給 enum 型別的變數時,要使用下列其中一項:完整正確的名稱 (例如 Color.Red)、名稱的字串 (String) 表示 (例如 "Red") 或數值。
如果 enum 是設定給在編譯時期就已知的字串,編譯器會執行需要的轉換。例如,會以 Color.Red 取代 "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