亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Swift > 正文

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

2020-03-09 17:48:24
字體:
供稿:網(wǎng)友

一、引言

在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}//1var char = Char.b.rawValue

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

enum Char:Int{  case a = 0  case b  case c}//1var char = Char.b.rawValue//bvar 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)  }}//50expFunc(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 = .Southswitch 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的值是3enum 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 = 9if 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)教程知識(shí)閱讀請(qǐng)移步到swift教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
菠萝蜜视频国产在线播放| 久久免费视频网站| 男女高潮又爽又黄又无遮挡| 久久www视频| 91国语精品自产拍| 最近中文字幕免费视频| 色撸撸在线视频| 日韩亚洲视频在线观看| 一区二区三区国产好的精华液| 国产ts人妖一区二区三区| 免费在线一级片| 黄上黄在线观看| 免费观看一区二区三区毛片| 色八戒一区二区三区| 中文字幕av观看| 欧美精品与人动性物交免费看| 中文字幕在线中文字幕在线中三区| 久久精品国产一区二区三区日韩| 精品久久久久久乱码天堂| 亚洲永久免费精品| 在线视频观看91| 亚洲免费网站在线观看| 欧美一区免费观看| av女优在线| 成人免费高清| 亚洲奶水xxxx哺乳期| 天天影视久久综合| 欧美最猛性xxxxx喷水| 成年人免费网站| 欧美涩涩视频| 国产精品区一区二区三含羞草| 国产在线观看不卡| 日本一二三视频| 亚洲乱码国产乱码精品精的特点| 爱搞国产精品| 日韩在线观看你懂的| 亚洲自拍与偷拍| 91亚洲国产成人精品性色| 极品白浆推特女神在线观看| 韩国一区二区三区在线观看| 国产精品久久久久久一区二区| 日韩免费一级片| 美女被艹视频网站| 1区2区3区精品视频| 综合国产在线观看| 久久久精品中文字幕麻豆发布| 粉嫩在线一区二区三区视频| jizz欧美性20| aaaaa级少妇高潮大片免费看| 色哟哟精品丝袜一区二区| 精国产品一区二区三区a片| 国产免费专区| 久久av免费观看| 日韩一级片网站| av香蕉成人| 国产鲁鲁视频在线观看免费| 色就是色欧美色图| 免费看欧美女人艹b| 综合 欧美 亚洲日本| 国产精品久久久久久福利一牛影视| 久久99精品国产麻豆婷婷洗澡| 日韩电影中文字幕一区| 这里只有精品在线观看| 国产免费一区二区三区四区五区| 精品欧美日韩一区二区| 国产精品美女久久久免费| 国产精选久久| 国产国产精品人在线视| 欧美激情亚洲视频| 国产成人香蕉在线视频网站| 久久久久久五月天久久久久久久久| 亚洲精品在线三区| 一个人看的www视频在线免费观看| 精品久久久久久综合日本欧美| 美女18一级毛片一品久道久久综合| 成人免费的视频| 99精品国产高清一区二区| 美女视频一区| 欧美一区二区三区高清视频| 无码人妻精品一区二区三| 精品视频97| 精品亚洲视频在线| 国产剧情在线观看| 国产毛片久久| 久久中文字幕国产| 中文成人无字幕乱码精品区| av网站导航在线观看免费| 亚洲网站情趣视频| 国产美女性感在线观看懂色av| 久久国产精品久久| 亚洲美女久久精品| 欧美日韩国产系列| 国产精品suv一区二区三区| 日韩在线视频免费看| 欧洲午夜精品| 欧美孕妇与黑人孕交| 91精品蜜臀一区二区三区在线| 九色蝌蚪自拍| 色喇叭免费久久综合| 欧美国产综合| 噜噜噜躁狠狠躁狠狠精品视频| 在线观看你懂| 久久久99久久精品女同性| 91香蕉国产线在线观看| 国产精品国语对白| 在线播放精品视频| 搡老女人一区二区三区视频tv| 亚洲精品国产综合久久| 国产精品国内视频| 99精品偷自拍| 久久综合色播| 久热国产在线| 中文字幕久久av| 欧美日韩国产精品专区| 三年中文高清在线观看第6集| 亚洲综合激情另类小说区| 欧美激情网址| 亚洲在线免费视频| 超碰97人人干| 日本在线观看网址| 视频在线日韩| 免费精品视频一区二区三区| 亚洲一区二区伦理| 91在线高清视频| 欧美日韩国产不卡在线看| 亚洲成人三级| 欧美久久九九| 在线观看美女网站大全免费| av影片在线| 久久精品凹凸全集| 国产精品毛片一区二区三区| 亚洲精品无码一区二区| 欧美日韩在线影院| 懂色一区二区三区免费观看| 在线观看网站黄不卡| 国产欧美日产一区| 欧美美女性生活视频| 国产区美女在线| 精品国产亚洲在线| 国产成人精品18| 日韩欧美精品在线观看| 99热亚洲精品| 日韩欧美国产精品| 国产精品久久久久久久久久东京| 国产在线精品二区| 性xxxxxxxxx18欧美| 日本一区二区三区视频| 久久久亚洲国产精品| 亚洲少妇一区二区| 午夜精品在线看| 欧美一区二区三区公司| 日一区二区三区| 中国特级黄色片| 91视频在线观看免费| 老司机免费视频| 亚洲成人手机在线| 国产主播色在线| 人人精品久久| 一本色道久久88亚洲综合88| 波多野结衣毛片| 国产精品久久久久久福利一牛影视| jizzjizzjizz国产| 色戒在线免费观看| 成人影视免费观看| gay欧美网站| 日韩经典在线观看| 日韩 国产 一区| av一区二区在线播放| 亚洲精品自拍视频在线观看| 欧美一级电影在线| 九九热这里有精品| 影音先锋电影在线观看| 欧美日韩第一区| 欧美性受xxxxxx黑人xyx性爽| 人操人爱免费视频| av网站大全在线| 在线 亚洲欧美在线综合一区| √天堂资源在线| 韩日精品中文字幕| xvideos国产在线视频| 成人免费av网站| 亚洲精品字幕| 久久免费看视频| 欧美电影《睫毛膏》| 色婷五月综激情亚洲综合| 日韩精品乱码久久久久久| 一道本视频在线观看| 欧美精品免费看| 99久久久免费精品| 精品美女www爽爽爽视频| 在线成人中文字幕| 成人看片免费| 国产精品视频久久一区| 日韩欧美在线一区二区三区| 亚洲尤物在线视频观看| 91视频免费观看| 国产中文精品久高清在线不| 欧美日韩国产传媒| 国产精品一区二区人妻喷水| 国外成人在线播放| 精品人妻少妇一区二区| 亚洲伦理网站| 精品三级在线| 日韩精品一级二级| 日本综合一区二区三区| 深夜福利免费在线观看| 黄色无遮挡网站| 日本www在线观看| 国产亚洲一卡2卡3卡4卡新区| 免费精品视频一区二区三区| 天天干中文字幕| 北岛玲日韩精品一区二区三区| 国产在线1区| 漫画在线观看av| 国产精品成人免费| 另类视频欧美| 9久草视频在线视频精品| 欧美精品小视频| 亚洲私人影吧| 黄动漫网站在线观看| 性欧美亚洲xxxx乳在线观看| 最新国产成人av网站网址麻豆| 91ph在线| 日韩黄色小视频| 你懂的视频一区二区| 亚洲国产日韩在线| 欧美午夜aaaaaa免费视频| 日韩激情毛片| 日韩av不卡电影| 久久久精品国产99久久精品芒果| 久久精品成人动漫| a视频在线观看| 国产一区二区三区亚洲综合| 这里只有精品6| 99视频精品全国免费| 粉嫩av性色av蜜臀av网站| 自拍视频网站| 91精品国产色综合久久不卡98口| 亚洲精品欧美二区三区中文字幕| 国内精品久久影院| 在线天堂www在线国语对白| av在线播放一区二区三区| 亚洲色图综合区| 成人免费一区二区三区牛牛| 精品精品国产高清一毛片一天堂| 欧美一级片一区| 亚洲欧洲日韩在线| 国产男女猛烈无遮挡a片漫画| 欧美日韩在线观看视频小说| 女人高潮被爽到呻吟在线观看| 美女毛片一区二区三区四区最新中文字幕亚洲| www黄色日本| 日韩国产网站| 日本中文字幕精品—区二区| 亚洲1区2区3区视频| 三上悠亚在线观看| 美女撒尿一区二区三区| 99国产一区| 欧美日韩第一区| 日韩电影中文字幕| 日本久久伊人| 日本免费网站| 欧美一级二级三级蜜桃| 国内精品久久久久久久久久久| 一区二区三区av电影| 五码日韩精品一区二区三区视频| 欧美国产日韩一区二区| caoporn97在线视频| 久久成年人视频| 亚洲最大的成人av| 国产精品第六页| 欧美二区在线观看| 尤物99国产成人精品视频| 成人免费一区二区三区牛牛| 伊人久久大香线蕉av超碰演员| 亚洲日本免费电影| 久久精品人人爽| 在线成人av观看| 国产精品毛片aⅴ一区二区三区| 国模一区二区三区| 丝袜老师在线| 国产精品18hdxxxⅹ在线| 91麻豆成人精品国产免费网站| 国产福利小视频在线| 99久久er热在这里只有精品15| 麻豆美女网站| 成人久久久久久久| 久久久久黄久久免费漫画| 欧美熟妇精品黑人巨大一二三区| 99精品一区二区三区| 7878成人国产在线观看| 亚洲男女自偷自拍| 国产午夜精品无码| 国产精品一区二区三区在线观| 国产在线日韩在线| 美女被男人操网站| 日韩在线视频一区二区三区| 亚洲人在线观看| 成人高潮成人免费观看| 国产精品高潮视频| 欧美性猛交xxxx乱| 国产欧美久久久久| 国产精品久久97| 日韩欧美一区二区视频在线播放| 亚洲欧美日韩激情| 国产福利91精品一区二区三区| 日韩大片在线观看视频| 国产精品h在线观看| av成人天堂| 成人午夜精品久久久久久久蜜臀| 午夜视黄欧洲亚洲| jizz日本| 91蜜桃免费观看视频| 日日夜夜操操操| 亚洲国产精品悠悠久久琪琪| 高清在线一区| 精品久久久91| 亚洲剧情一区二区| 香蕉在线观看视频| 欧美大成色www永久网站婷| 日韩中文字幕麻豆| 五月综合激情| 国户精品久久久久久久久久久不卡| 亚洲毛片av| 最新一本之道波多野结衣| www.成人.com| 国产青青视频| 91成人国产综合久久精品|