Swift列舉


列舉是使用者定義的資料型別,由一組相關值組成。 關鍵字enum用於定義列舉資料型別。

列舉功能

Swift 4中的列舉也類似於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:
      print("Welcome to Swift")
   case .Closures:
      print("Welcome to Closures")
   default:
      print("Introduction")
}

當使用playground執行上述程式時,得到以下結果 -

Welcome to Closures

Swift 4列舉不會像C語言和Objective C那樣為其成員分配預設值。它的成員由列舉名稱顯式定義。 列舉名稱應以大寫字母開頭(例如:enum DaysofaWeek)。

var weekDay = DaysofaWeek.Sunday

這裡列舉名稱DaysofaWeek分配給變數weekday.Sunday。 它通知編譯器資料型別屬於Sunday將被分配給該特定類的後續列舉成員。 當定義了列舉成員資料型別,就可以通過傳遞值和進一步計算來存取成員。

使用Switch語句進行列舉

Swift 4的’switch’語句也遵循多路選擇。 根據指定的條件,在特定時間僅存取一個變數。 switch語句中的預設情況用於捕獲未指定的情況。範例程式碼 -

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

var season = Climate.America
season = .America
switch season {
   case .China:
      print("Climate is Hot")
   case .America:
      print("Climate is Cold")
   case .Africa:
      print("Climate is Moderate")
   case .Australia:
      print("Climate is Rainy")

}

當使用playground執行上述程式時,得到以下結果 -

Climate is Cold

上面程式首先將Climate定義為列舉名稱。 然後,它的成員如:ChinaAmericaAfricaAustralia,宣告屬於Climate類。 現在,America成員被分配到season變數。 此外,Switch case將比較.America相對應的值,它將分支到該特定語句。 輸出將顯示為Climate is Cold。 同樣,可以通過switch語句存取所有成員。 當條件不滿足時,預設列印Climate is not predictable

列舉可以進一步分類為關聯值和原始值。

關聯值與原始值的區別

關聯值 原始值
不同的資料型別 相同的資料型別
例如:enum {10,0.8,"Hello"} 例如:enum {1, 20, 99, 1999}
值基於常數或變數建立 預先填充的值
每次宣告時都會變化 成員值相同

具有相關值的列舉

enum Student {
   case Name(String)
   case Mark(Int,Int,Int)
}

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

switch studMarks {
   case .Name(let studName):
      print("Student name is: \(studName).")
   case .Mark(let Mark1, let Mark2, let Mark3):
      print("Student Marks are: \(Mark1),\(Mark2),\(Mark3).")
}

當使用playground執行上述程式時,得到以下結果 -

Student Marks are: 98,97,95.

例如,考慮存取三個科目的學生姓名和分數,列舉名稱宣告為Student,列舉類中的成員Name是屬於字串資料型別,Mark表示為整數型別的:mark1mark2mark3。 存取學生姓名或分數程式碼如下 -

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
print("Value of the Month is: \(yearMonth).")

當使用playground執行上述程式時,得到以下結果 -

Value of the Month is: 5.