Latest web development tutorials

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("星期六")
}

以上程序執行輸出結果為:

星期四

枚舉中定義的值(如SundayMonday……Saturday )是這個枚舉的成員值 (或成員 )。 case關鍵詞表示一行新的成員值將被定義。

注意: 和C 和Objective-C 不同,Swift 的枚舉成員在被創建時不會被賦予一個默認的整型值。 在上面的DaysofaWeek例子中, SundayMonday……Saturday不會隱式地賦值為01……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 的一個相關值(Int,Int,Int,Int),或者是Mark 的一個字符串類型(String)相關值。

import Cocoa

enum Student{
    case Name(String)
    case Mark(Int,Int,Int)
}
var studDetails = Student.Name("w3big")
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。