程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> 詳解Swift中enum枚舉類型的用法

詳解Swift中enum枚舉類型的用法

編輯:更多關於編程

詳解Swift中enum枚舉類型的用法。本站提示廣大學習愛好者:(詳解Swift中enum枚舉類型的用法)文章只能為提供參考,不一定能成為您想要的結果。以下是詳解Swift中enum枚舉類型的用法正文


一、引言

在Objective-C言語中,沒有實踐上是整型數據,Swift中的枚舉則愈加靈敏,開發者可以不為其分配值類型把枚舉作為獨立的類型來運用,也可以為其分配值,可以是字符,字符串,整型或許浮點型數據。

二、枚舉語法

Swift中enum關鍵字來停止枚舉的創立,運用case來創立每一個枚舉值,示例如下:

//創立姓氏枚舉,和Objective-C不同,Swift枚舉不會默許分配值
enum Surname {
  case 張
  case 王
  case 李
  case 趙
}
//創立一個枚舉類型的變量
var myName = Surname.張
//假如可以自動推斷出類型 則枚舉類型可以省略
myName = .李
var myName2:Surname = .王

異樣可以將枚舉值都寫在同一個case中,運用逗號分隔:
enum Planet {
  case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}

枚舉常常會和Switch語句結合運用,示例如下:
switch myName {
case .張:
  print("姓氏張")
case .王:
  print("姓氏王")
case .李:
  print("姓氏李")
case .趙:
  print("姓氏趙")
}

三、枚舉的相關值

Swift中的枚舉有一個很有意思的特點,其可以設置一些相關值,經過相關值,開發者可以從公用的枚舉值中獲取到傳遞的額定相關值,示例如下:

enum Number {
  case one(count:Int)
  case two(count:Int)
  case three(count:Int)
  case four(count:Int)
}
var num = Number.one(count: 5)
switch num {
  //獲取num的相關值
case Number.one(let count):
  print(count)
default:
  print(num)
}
//假如一個枚舉值一切的相關中都是常量,let關鍵字也可以提取到括號裡面
switch num {
  //獲取num的相關值
case let Number.one(count):
  print(count)
default:
  print(num)
}

有了相關值這樣的句法,大大的添加了枚舉的靈敏性,例如一個外形枚舉,能夠的枚舉值有矩形,圓形等,矩形的枚舉值就可以提供寬高的相關值,圓形的枚舉值就可以提供半徑的相關值,是開發愈加靈敏。

四、枚舉的原始值

原始值也可以了解為為枚舉設置一個詳細類型,示例如下:

enum Char:String {
  case a = "A"
  case b = "B"
  case c = "C"
}
//”A“
var char = Char.a.rawValue

留意,假如枚舉是Int類型的,則相似於Objective-C,枚舉的原始值會從第一個開端之後順次遞增:

enum Char:Int{
  case a = 0
  case b
  case c
}
//1
var char = Char.b.rawValue

異樣可以經過原始值的方式來停止枚舉對象的創立,示例如下:

enum Char:Int{
  case a = 0
  case b
  case c
}
//1
var char = Char.b.rawValue
//b
var char2 = Char(rawValue:1)

在經過原始值停止枚舉對象創立的時分,有能夠創立失敗,例如傳入的原始值並不存在,這時會前往Optional值nil。

四、遞歸枚舉

遞歸枚舉是Swift枚舉中一個難於了解的中央,實踐上也並非非常難於了解,開發者只需明白枚舉的本質,遞歸枚舉就很好了解。首先,遞歸是一種算法,可以復雜了解為自己調用自己,而枚舉實踐上並不是函數,它並不執行某項運算,它只是表達一個數據或許說他也可以表達一種表達式,示例如下:

enum Expression {
  //表示加
  case add
  //表示減
  case mul
}

後面有提到過相關值的概念,因而,關於上述例子,可以為add和mul枚舉值添加兩個相關值作為參數。

enum Expression {
  //表示加
  case add(Int,Int)
  //表示減
  case mul(Int,Int)
}

如此,如下的寫法實踐上就可以代表一個5+5的表達式:

var exp = Expression.add(5, 5)

還是需求強調一點,這個exp只是表達了5+5這樣一個商定的表達式,它並沒有真正停止5+5的運算。如今問題就來了,運用如上的枚舉,怎樣來表達相似(5+5)*5這樣的復合表達式呢?可以運用遞歸枚舉來完成,行將(5+5)作為枚舉值得相關值再次創立枚舉,改造如下:

enum Expression {
  //單值數據
  case num(Int)
  //表示加 indirect為遞歸枚舉關鍵字
  indirect case add(Expression,Expression)
  //表示減
  indirect case mul(Expression,Expression)
}
var exp1 = Expression.num(5)
var exp2 = Expression.num(5)
var exp3 = Expression.add(exp1, exp2)
var exp4 = Expression.mul(exp1, exp3)

下面exp4實踐上就表達了(5+5)*5這樣一個進程,留意遞歸的枚舉值必需加上indirect關鍵字來聲明。處置遞歸枚舉最好的方式是經過遞歸函數,示例如下:

func expFunc(param:Expression) -> Int {
  //停止枚舉判別
  switch param {
    //假如是獨自數字 直接前往
  case .num(let p):
    return p
    //假如是加法 則停止遞歸加
  case .add(let one, let two):
    return expFunc(one)+expFunc(two)
    //假如是乘法 則停止遞歸乘
  case .mul(let one, let two):
    return expFunc(one)*expFunc(two)
  }
}
//50
expFunc(exp4)

假如枚舉中一切的case都是可遞歸的,可以將整個枚舉聲明為可遞歸的:

indirect enum Expression {
  //單值數據
  case num(Int)
  //表示加 indirect為遞歸枚舉關鍵字
  case add(Expression,Expression)
  //表示減
  case mul(Expression,Expression)
}

五、一些重點難點總結
枚舉的語法,enum掃尾,每一行成員的定義運用case關鍵字掃尾,一行可以定義多個關鍵字

enum CompassPoint {
  case North
  case South
  case East
  case West
}

enum Planet {
  case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}

上例中North,South,East,West的值並不等於0,1,2,3,而是他們自身就是自己的值,且該值的類型就是CompassPoint

var directionToHead = CompassPoint.West 
//directionToHead是一個CompassPoint類型,可以被賦值為該類型的其他值
//當設置directionToHead的值時,他的類型是已知的,因而可以省略East的類型
directionToHead = .East

運用switch分開枚舉的值,以停止的不同的操作。switch內的case必需包括枚舉的一切分支,否則編譯出錯。當然,羅列一切枚舉值不太方便時,可以運用default

directionToHead = .South
switch directionToHead {
case .North:
  println("Lots of planets have a north")
case .South:
  println("Watch out for penguins")
case .East:
  println("Where the sun rises")
case .West:
  println("Where the skies are blue")
}
// 打印 "Watch out for penguins"

枚舉的元素可以是結合值(associated value),上面經過一個可以存儲一維條形碼(由3個整數組成)和二維條形碼(由字符串組成)的枚舉條形碼實例來闡明

enum Barcode {
  case UPCA(Int, Int, Int)
  case QRCode(String)
}
//定義一個變量。該變量即可被賦值為3個整數,又可被賦值為一個字符串,但都是Barcode類型的枚舉值
var productBarcode = Barcode.UPCA(8, 85909_51226, 3)
productBarcode = .QRCode("ABCDEFGHIJKLMNOP")

//運用switch時,case內可區分條形碼品種,可運用變量或常量取得結合值
switch productBarcode {
case .UPCA(let numberSystem, let identifier, let check):
  println("UPC-A with value of \(numberSystem), \(identifier), \(check).")
case .QRCode(let productCode):
  println("QR code with value of \(productCode).")
}
// 打印 "QR code with value of ABCDEFGHIJKLMNOP."

在case外部,假如其類型都為let或var,則該關鍵字可提早到case和枚舉類型兩頭,如:

case let .UPCA(numberSystem, identifier, check):

原始值類型的枚舉在枚舉名後緊跟數據類型,其枚舉的成員在定義時曾經賦予了初始值,且不能改動,與結合值類型的枚舉相比,結合值是在將枚舉值賦予一個變量時,才設置了那個枚舉的值。

原始值枚舉更像C言語的枚舉,比方整數型的原始值枚舉,其成員的值假如未指定,則是遞增的。

原始值枚舉也像字典類型,並且是雙向字典,由於他既可以經過枚舉成員取得該成員原始值,又可以經過原始值,取得枚舉成員。由此也可以見得,這種枚舉的原始值是不能呈現相反值的

//原始值枚舉的類型緊跟枚舉名後,其成員的原始值的數據類型都是這個指定的類型
enum ASCIIControlCharacter: Character {
  case Tab = "\t"
  case LineFeed = "\n"
  case CarriageReturn = "\r"
}
//Int類型的原始值枚舉成員的原始值是遞增的,比方Venus的值是2,Earth的值是3
enum Planet: Int {
  case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}
//可以經過toRaw辦法取得枚舉成員的原始值
let earthsOrder = Planet.Earth.toRaw()
// earthsOrder 的值是 3,數據類型是Int

//可以經過fromRaw辦法取得原始值對應的枚舉成員
let possiblePlanet = Planet.fromRaw(7)
// possiblePlanet 的數據類型 Planet? 值是 Planet.Uranus

//由於fromRaw的原始值能夠沒有對應的枚舉成員,所以前往的類型是一個可選變量值
let positionToFind = 9
if let somePlanet = Planet.fromRaw(positionToFind) {
  switch somePlanet {
  case .Earth:
    println("Mostly harmless")
  default:
    println("Not a safe place for humans")
  }
} else {
  println("There isn't a planet at position \(positionToFind)")
}
// 枚舉定義中沒有原始值為9的成員,所以打印 "There isn't a planet at position 9"

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved