Swift 列舉
列舉簡單的說也是一種資料型別,只不過是這種資料型別只包含自定義的特定資料,它是一組有共同特性的資料的集合。
Swift 的列舉類似於 Objective C 和 C 的結構,列舉的功能為:
它宣告在類中,可以通過例項化類來訪問它的值。
列舉也可以定義建構函式(initializers)來提供一個初始成員值;可以在原始的實現基礎上擴充套件它們的功能。
可以遵守協議(protocols)來提供標準的功能。
語法
Swift 中使用 enum 關鍵詞來建立列舉並且把它們的整個定義放在一對大括號內:
enum enumname { // 列舉定義放在這裡 }
例如我們定義以下表示星期的列舉:
import Cocoa // 定義列舉 enum DaysofaWeek { case Sunday case Monday case TUESDAY case WEDNESDAY case THURSDAY case FRIDAY case Saturday } var weekDay = DaysofaWeek.THURSDAY weekDay = .THURSDAY switch weekDay { case .Sunday: print("星期天") case .Monday: print("星期一") case .TUESDAY: print("星期二") case .WEDNESDAY: print("星期三") case .THURSDAY: print("星期四") case .FRIDAY: print("星期五") case .Saturday: print("星期六") }
以上程式執行輸出結果為:
星期四
列舉中定義的值(如 Sunday
,Monday
,……
和Saturday
)是這個列舉的成員值(或成員)。case
關鍵詞表示一行新的成員值將被定義。
注意: 和 C 和 Objective-C 不同,Swift 的列舉成員在被建立時不會被賦予一個預設的整型值。在上面的
DaysofaWeek
例子中,Sunday
,Monday
,……
和Saturday
不會隱式地賦值為0
,1
,……
和6
。相反,這些列舉成員本身就有完備的值,這些值是已經明確定義好的DaysofaWeek
型別。
var weekDay = DaysofaWeek.THURSDAY
weekDay
的型別可以在它被DaysofaWeek
的一個可能值初始化時推斷出來。一旦weekDay
被宣告為一個DaysofaWeek
,你可以使用一個縮寫語法(.)將其設定為另一個DaysofaWeek
的值:
var weekDay = .THURSDAY
當weekDay
的型別已知時,再次為其賦值可以省略列舉名。使用顯式型別的列舉值可以讓程式碼具有更好的可讀性。
列舉可分為相關值與原始值。
相關值與原始值的區別
相關值 | 原始值 |
---|---|
不同資料型別 | 相同資料型別 |
例項: enum {10,0.8,"Hello"} | 例項: enum {10,35,50} |
值的建立基於常量或變數 | 預先填充的值 |
相關值是當你在建立一個基於列舉成員的新常量或變數時才會被設定,並且每次當你這麼做得時候,它的值可以是不同的。 | 原始值始終是相同的 |
相關值
以下例項中我們定義一個名為 Student 的列舉型別,它可以是 Name 的一個字串(String),或者是 Mark 的一個相關值(Int,Int,Int)。
import Cocoa enum Student{ case Name(String) case Mark(Int,Int,Int) } var studDetails = Student.Name("itread01") var studMarks = Student.Mark(98,97,95) switch studMarks { case .Name(let studName): print("學生的名字是: \(studName)。") case .Mark(let Mark1, let Mark2, let Mark3): print("學生的成績是: \(Mark1),\(Mark2),\(Mark3)。") }
以上程式執行輸出結果為:
學生的成績是: 98,97,95。
原始值
原始值可以是字串,字元,或者任何整型值或浮點型值。每個原始值在它的列舉宣告中必須是唯一的。
在原始值為整數的列舉時,不需要顯式的為每一個成員賦值,Swift會自動為你賦值。
例如,當使用整數作為原始值時,隱式賦值的值依次遞增1。如果第一個值沒有被賦初值,將會被自動置為0。import Cocoa enum Month: Int { case January = 1, February, March, April, May, June, July, August, September, October, November, December } let yearMonth = Month.May.rawValue print("數字月份為: \(yearMonth)。")
以上程式執行輸出結果為:
數字月份為: 5。