位置:首頁 > 高級語言 > Swift教學 > Swift枚舉

Swift枚舉

枚舉是由用戶定義的數據類型的一組相關值。關鍵字 enum 用來定義枚舉數據類型。

枚舉功能

枚舉在 swift 也類似於 C 和 Objective C 中結構類型

  • 它是在一個類中聲明,其值是通過該類的實例來訪問

  • 初始成員值是用枚舉初始化定義的

  • 其功能也擴展確保標準的協議功能

語法

枚舉引入 enum 關鍵字和一對大括號內將它們定義:

enum enumname {
   // enumeration values are described here
}

例如,可以為星期定義枚舉如下:

enum DaysofaWeek {
   case Sunday
   case Monday
    ---
   case Saturday
}

示例

enum names{
   case Swift
   case Closures
}
var lang = names.Closures
lang = .Closures
switch lang
{
   case .Swift:
   println("Welcome to Swift")
   case .Closures:
   println("Welcome to Closures")
   default:
   println("Introduction")
}

當我們上麵的程序使用 playground 運行,我們得到以下結果

Welcome to Closures

Swift 中的枚舉不象 C 和 Objective C 分配其成員的默認值,相反,成員由它們枚舉名稱明確定義。枚舉名稱應該使用大寫字母(例如:enum DaysofaWeek)。

var weekDay = DaysofaWeek.Sunday 

這裡所述枚舉名'DaysofaWeek'被分配給一個變量 weekday.Sunday。它通知編譯器數據類型屬於周日將被分配給該特定類的後續枚舉成員。一旦枚舉成員的數據類型定義,其成員可以通過傳遞值,並進一步計算進行訪問。

枚舉與Switch語句

Swift 中的 'Switch' 語句也遵循了多路選擇。 隻有一個變量被以基於指定的條件的特定時間訪問。默認情況下,在switch語句用於捕獲不確定的情況(case)。

enum Climate{
   case India
   case America
   case Africa
   case Australia
}

var season = Climate.America
season = .America
switch season
{
   case .India:
      println("Climate is Hot")
   case .America:
      println("Climate is Cold")
   case .Africa:
      println("Climate is Moderate")
   case .Australia:
      println("Climate is Rainy")
   default:
      println("Climate is not predictable")
}

當我們上麵的程序使用 playground 運行,我們得到以下結果

Climte is Cold

該程序首先定義了Climate 作為枚舉名稱。那麼它的成員如, 'China', 'America', 'Africa' 和 'Australia' 聲明屬於類 'Climate'. 現在成員 America 被分配到一個 Season 變量。此外,Switch case可以找到對應 .America 的值,並跳轉到該特定語句。 輸出將顯示為 “Climate is Cold”。同樣,所有成員可以通過 switch 語句訪問。 當條件不滿足它打印默認內容 'Climate is not predictable'

枚舉可進一步劃分到相關的值和原始值。

關聯值和原始值之間的差異

關聯值 原始值
不同的數據類型 相同的數據類型
例如: enum {10,0.8,"Hello"} 例如: enum {10,35,50}
在常量值或變量基礎上創建值 預先填充值
每次聲明都會變化 成員的值不變

枚舉與關聯值

enum Student{
   case Name(String)
   case Mark(Int,Int,Int)
}
var studDetails = Student.Name("Swift")
var studMarks = Student.Mark(98,97,95)
switch studMarks {
   case .Name(let studName):
      println("Student name is: \(studName).")
   case .Mark(let Mark1, let Mark2, let Mark3):
      println("Student Marks are: \(Mark1),\(Mark2),\(Mark3).")
   default:
      println("Nothing")
}

當我們上麵的程序使用 playground 運行,我們得到以下結果

Swift
98
97
95

例如,考慮訪問學生的名字和標記固定在三個科目枚舉名稱被聲明為 student ,而在枚舉類中的成員名稱都屬於字符串數據類型,標記表示為 mark1, mark2 和 mark3 數據類型為整數。若要訪問的是學生的名字或標記分數:

var studDetails = Student.Name("Swift")
var studMarks = Student.Mark(98,97,95)

現在,如果塊初執行,switch case 將打印學生姓名,否則它將打印學生固定的標記。 如果這兩個條件都失敗了,將執行默認塊。

枚舉與原始值

原始值可以是字符串,字符,或任何整數或浮點數類型。每個原始值必須在其枚舉聲明中是唯一的。當整數用於原始值,如果指定的一些枚舉成員冇有任何值,它們會自動遞增。

enum Month: Int {
   case January = 1, February, March, April, May, June, July, August, September, October, November, December
}

let yearMonth = Month.May.rawValue
println("Value of the Month is: \(yearMonth).")

當我們上麵的程序使用 playground 運行,我們得到以下結果:

Value of the Month is: 5.