最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2016年06月28日 18:29:31   作者:火鏡先生  
Swift中通過enum關(guān)鍵字可以直接創(chuàng)建出枚舉對(duì)象,而且可以使用switch和case語句來進(jìn)行流程控制,十分強(qiáng)大和靈活,這里我們就來詳解Swift中enum枚舉類型的用法

一、引言

在Objective-C語言中,沒有實(shí)際上是整型數(shù)據(jù),Swift中的枚舉則更加靈活,開發(fā)者可以不為其分配值類型把枚舉作為獨(dú)立的類型來使用,也可以為其分配值,可以是字符,字符串,整型或者浮點(diǎn)型數(shù)據(jù)。

二、枚舉語法

Swift中enum關(guān)鍵字來進(jìn)行枚舉的創(chuàng)建,使用case來創(chuàng)建每一個(gè)枚舉值,示例如下:

//創(chuàng)建姓氏枚舉,和Objective-C不同,Swift枚舉不會(huì)默認(rèn)分配值
enum Surname {
  case 張
  case 王
  case 李
  case 趙
}
//創(chuàng)建一個(gè)枚舉類型的變量
var myName = Surname.張
//如果可以自動(dòng)推斷出類型 則枚舉類型可以省略
myName = .李
var myName2:Surname = .王

同樣可以將枚舉值都寫在同一個(gè)case中,使用逗號(hào)分隔:
enum Planet {
  case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}

枚舉經(jīng)常會(huì)和Switch語句結(jié)合使用,示例如下:
switch myName {
case .張:
  print("姓氏張")
case .王:
  print("姓氏王")
case .李:
  print("姓氏李")
case .趙:
  print("姓氏趙")
}

三、枚舉的相關(guān)值

Swift中的枚舉有一個(gè)很有意思的特點(diǎn),其可以設(shè)置一些相關(guān)值,通過相關(guān)值,開發(fā)者可以從公用的枚舉值中獲取到傳遞的額外相關(guān)值,示例如下:

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的相關(guān)值
case Number.one(let count):
  print(count)
default:
  print(num)
}
//如果一個(gè)枚舉值所有的相關(guān)中都是常量,let關(guān)鍵字也可以提取到括號(hào)外面
switch num {
  //獲取num的相關(guān)值
case let Number.one(count):
  print(count)
default:
  print(num)
}

有了相關(guān)值這樣的句法,大大的增加了枚舉的靈活性,例如一個(gè)形狀枚舉,可能的枚舉值有矩形,圓形等,矩形的枚舉值就可以提供寬高的相關(guān)值,圓形的枚舉值就可以提供半徑的相關(guān)值,是開發(fā)更加靈活。

四、枚舉的原始值

原始值也可以理解為為枚舉設(shè)置一個(gè)具體類型,示例如下:

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

注意,如果枚舉是Int類型的,則類似于Objective-C,枚舉的原始值會(huì)從第一個(gè)開始之后依次遞增:

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

同樣可以通過原始值的方式來進(jìn)行枚舉對(duì)象的創(chuàng)建,示例如下:

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

在通過原始值進(jìn)行枚舉對(duì)象創(chuàng)建的時(shí)候,有可能創(chuàng)建失敗,例如傳入的原始值并不存在,這時(shí)會(huì)返回Optional值nil。

四、遞歸枚舉

遞歸枚舉是Swift枚舉中一個(gè)難于理解的地方,實(shí)際上也并非十分難于理解,開發(fā)者只要明白枚舉的實(shí)質(zhì),遞歸枚舉就很好理解。首先,遞歸是一種算法,可以簡(jiǎn)單理解為自己調(diào)用自己,而枚舉實(shí)際上并不是函數(shù),它并不執(zhí)行某項(xiàng)運(yùn)算,它只是表達(dá)一個(gè)數(shù)據(jù)或者說他也可以表達(dá)一種表達(dá)式,示例如下:

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

前面有提到過相關(guān)值的概念,因此,對(duì)于上述例子,可以為add和mul枚舉值添加兩個(gè)相關(guān)值作為參數(shù)。

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

如此,如下的寫法實(shí)際上就可以代表一個(gè)5+5的表達(dá)式:

var exp = Expression.add(5, 5)

還是需要強(qiáng)調(diào)一點(diǎn),這個(gè)exp只是表達(dá)了5+5這樣一個(gè)約定的表達(dá)式,它并沒有真正進(jìn)行5+5的運(yùn)算?,F(xiàn)在問題就來了,使用如上的枚舉,怎樣來表達(dá)類似(5+5)*5這樣的復(fù)合表達(dá)式呢?可以使用遞歸枚舉來實(shí)現(xiàn),即將(5+5)作為枚舉值得相關(guān)值再次創(chuàng)建枚舉,改造如下:

enum Expression {
  //單值數(shù)據(jù)
  case num(Int)
  //表示加 indirect為遞歸枚舉關(guān)鍵字
  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實(shí)際上就表達(dá)了(5+5)*5這樣一個(gè)過程,注意遞歸的枚舉值必須加上indirect關(guān)鍵字來聲明。處理遞歸枚舉最好的方式是通過遞歸函數(shù),示例如下:

func expFunc(param:Expression) -> Int {
  //進(jìn)行枚舉判斷
  switch param {
    //如果是單獨(dú)數(shù)字 直接返回
  case .num(let p):
    return p
    //如果是加法 則進(jìn)行遞歸加
  case .add(let one, let two):
    return expFunc(one)+expFunc(two)
    //如果是乘法 則進(jìn)行遞歸乘
  case .mul(let one, let two):
    return expFunc(one)*expFunc(two)
  }
}
//50
expFunc(exp4)

如果枚舉中所有的case都是可遞歸的,可以將整個(gè)枚舉聲明為可遞歸的:

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

五、一些重點(diǎn)難點(diǎn)總結(jié)
枚舉的語法,enum開頭,每一行成員的定義使用case關(guān)鍵字開頭,一行可以定義多個(gè)關(guān)鍵字

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是一個(gè)CompassPoint類型,可以被賦值為該類型的其他值
//當(dāng)設(shè)置directionToHead的值時(shí),他的類型是已知的,因此可以省略East的類型
directionToHead = .East

使用switch分開枚舉的值,以進(jìn)行的不同的操作。switch內(nèi)的case必須包含枚舉的所有分支,否則編譯出錯(cuò)。當(dāng)然,列舉所有枚舉值不太方便時(shí),可以使用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"

枚舉的元素可以是結(jié)合值(associated value),下面通過一個(gè)可以存儲(chǔ)一維條形碼(由3個(gè)整數(shù)組成)和二維條形碼(由字符串組成)的枚舉條形碼實(shí)例來說明

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

//使用switch時(shí),case內(nèi)可區(qū)分條形碼種類,可使用變量或常量獲得結(jié)合值
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內(nèi)部,如果其類型都為let或var,則該關(guān)鍵字可提前到case和枚舉類型中間,如:

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

原始值類型的枚舉在枚舉名后緊跟數(shù)據(jù)類型,其枚舉的成員在定義時(shí)已經(jīng)賦予了初始值,且不能改變,與結(jié)合值類型的枚舉相比,結(jié)合值是在將枚舉值賦予一個(gè)變量時(shí),才設(shè)置了那個(gè)枚舉的值。

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

原始值枚舉也像字典類型,并且是雙向字典,因?yàn)樗瓤梢酝ㄟ^枚舉成員獲得該成員原始值,又可以通過原始值,獲得枚舉成員。由此也可以見得,這種枚舉的原始值是不能出現(xiàn)相同值的

//原始值枚舉的類型緊跟枚舉名后,其成員的原始值的數(shù)據(jù)類型都是這個(gè)指定的類型
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,數(shù)據(jù)類型是Int

//可以通過fromRaw方法獲得原始值對(duì)應(yīng)的枚舉成員
let possiblePlanet = Planet.fromRaw(7)
// possiblePlanet 的數(shù)據(jù)類型 Planet? 值是 Planet.Uranus

//因?yàn)閒romRaw的原始值可能沒有對(duì)應(yīng)的枚舉成員,所以返回的類型是一個(gè)可選變量值
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"

相關(guān)文章

  • 用Swift編寫自動(dòng)錄音器

    用Swift編寫自動(dòng)錄音器

    這篇文章主要介紹了用Swift編寫自動(dòng)錄音器,有需要的朋友可以借鑒下
    2015-07-07
  • Swift3.0仿支付寶二維碼掃描效果

    Swift3.0仿支付寶二維碼掃描效果

    這篇文章主要為大家詳細(xì)介紹了Swift3.0仿支付寶二維碼掃描效果的相關(guān)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • Swift?中的?JSON?反序列化示例詳解

    Swift?中的?JSON?反序列化示例詳解

    這篇文章主要為大家介紹了Swift中的JSON?反序列化示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • Swift教程之集合類型詳解

    Swift教程之集合類型詳解

    這篇文章主要介紹了Swift教程之集合類型詳解,Swift 提供兩種集合類型來存儲(chǔ)集合,數(shù)組和字典,本文詳細(xì)講解了數(shù)組的創(chuàng)建、讀取和修改數(shù)組、遍歷數(shù)組以及集合的操作等內(nèi)容,需要的朋友可以參考下
    2015-01-01
  • 在SpringBoot中實(shí)現(xiàn)適配器模式的兩種方式

    在SpringBoot中實(shí)現(xiàn)適配器模式的兩種方式

    這篇文章主要介紹了在SpringBoot中實(shí)現(xiàn)適配器模式的兩種方式,通過實(shí)現(xiàn)類定義類型字段實(shí)現(xiàn)和以動(dòng)態(tài)service名稱的方式實(shí)現(xiàn),并且通過代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-03-03
  • Swift縮放并填充圖片功能的實(shí)現(xiàn)

    Swift縮放并填充圖片功能的實(shí)現(xiàn)

    最近有一個(gè)需求,就是將圖片先等比例縮放到指定大小,然后將空余出來空間填充為黑色,返回指定大小的圖片。本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2021-11-11
  • SwiftUI?List在MacOS中的性能優(yōu)化示例

    SwiftUI?List在MacOS中的性能優(yōu)化示例

    這篇文章主要為大家介紹了SwiftUI?List在MacOS中的性能優(yōu)化示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 用SwiftUI實(shí)現(xiàn)3D Scroll滾動(dòng)效果的實(shí)現(xiàn)代碼

    用SwiftUI實(shí)現(xiàn)3D Scroll滾動(dòng)效果的實(shí)現(xiàn)代碼

    這篇文章主要介紹了用SwiftUI實(shí)現(xiàn)3D Scroll效果的實(shí)現(xiàn)代碼,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)
    2020-04-04
  • Swift簡(jiǎn)單快速的動(dòng)態(tài)更換app圖標(biāo)AppIcon方法示例

    Swift簡(jiǎn)單快速的動(dòng)態(tài)更換app圖標(biāo)AppIcon方法示例

    這篇文章主要為大家介紹了Swift動(dòng)態(tài)更換app圖標(biāo)AppIcon的簡(jiǎn)單快速方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • 淺談swift 4.0中private所發(fā)生的變化

    淺談swift 4.0中private所發(fā)生的變化

    Swift 4是蘋果計(jì)劃于2017年秋季推出的最新版本,其主要重點(diǎn)是提供與Swift 3代碼的源兼容性,并努力實(shí)現(xiàn)ABI穩(wěn)定性。下面這篇文章主要給大家介紹了關(guān)于swift 4.0中private所發(fā)生的一些變化,需要的朋友可以參考下。
    2017-12-12

最新評(píng)論

衡阳县| 漠河县| 贺兰县| 灵武市| 岳普湖县| 红桥区| 双桥区| 和平区| 奉化市| 策勒县| 彭阳县| 四平市| 林口县| 黄骅市| 兴海县| 二连浩特市| 图木舒克市| 龙口市| 阳东县| 青岛市| 南昌县| 鹤岗市| 乌拉特前旗| 惠东县| 永和县| 雅江县| 汤原县| 洛扎县| 拉孜县| 左云县| 延寿县| 二手房| 井冈山市| 凤台县| 孝义市| 高青县| 长兴县| 常熟市| 信阳市| 玛纳斯县| 连江县|