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

首頁 > 編程 > Swift > 正文

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

2020-03-09 17:48:24
字體:
來源:轉載
供稿:網友

一、引言

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

同樣可以通過原始值的方式來進行枚舉對象的創建,示例如下:

enum Char:Int{  case a = 0  case b  case c}//1var char = Char.b.rawValue//bvar 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的運算?,F在問題就來了,使用如上的枚舉,怎樣來表達類似(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)  }}//50expFunc(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 = .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"

枚舉的元素可以是結合值(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的值是3enum 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 = 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"


注:相關教程知識閱讀請移步到swift教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
福利精品视频在线| 日韩高清免费在线| 久久精品美女视频网站| 国产欧亚日韩视频| 在线观看日韩专区| www.欧美视频| 久久精品成人欧美大片| 日韩欧美高清在线视频| 欧美色播在线播放| 亚洲电影免费观看| 国产91色在线播放| 亚洲福利视频免费观看| 欧美亚洲视频一区二区| 日韩精品高清在线| 影音先锋欧美精品| 国产成人精品免费久久久久| 久久精品一区中文字幕| 国产精品成人一区| 亚洲91精品在线观看| www.亚洲人.com| 日韩精品视频免费在线观看| 国产精品久久久一区| 久久久久久亚洲精品中文字幕| 国产在线观看不卡| 最新国产成人av网站网址麻豆| 欧美黑人巨大xxx极品| 亚洲精品一区二区在线| 国产精品嫩草影院一区二区| 欧美风情在线观看| 91精品久久久久久久久久| 97热精品视频官网| 国产精品18久久久久久麻辣| 欧美三级欧美成人高清www| 国产精品美女主播在线观看纯欲| 欧美劲爆第一页| 美女国内精品自产拍在线播放| 欧美午夜视频在线观看| 国产成人精品免费视频| 久久精品久久久久| 国产亚洲精品久久| 欧美综合在线观看| 欧美日韩第一视频| 77777少妇光屁股久久一区| 国产精品国产三级国产专播精品人| 久久99久国产精品黄毛片入口| 日韩av手机在线观看| 欧美成人精品激情在线观看| 国产亚洲一区二区在线| 国产成人精彩在线视频九色| 国产精品成人国产乱一区| 国产精品爱啪在线线免费观看| 久久成人av网站| 日韩国产中文字幕| 国产亚洲视频中文字幕视频| 国产精品高潮呻吟久久av野狼| 中文字幕一区电影| 亚洲性av在线| 欧美激情国产精品| 久久久亚洲成人| 国产成人精品网站| 欧美日韩一区二区在线| 亚洲色图狂野欧美| 欧美大片在线免费观看| 91天堂在线观看| 精品无人区太爽高潮在线播放| 久久精品国产亚洲7777| 全色精品综合影院| 国产精品高清免费在线观看| 97激碰免费视频| 久久噜噜噜精品国产亚洲综合| 国内精品国产三级国产在线专| 欧美激情中文网| 日韩久久精品电影| 色偷偷888欧美精品久久久| 国产欧美在线视频| 亚洲国产欧美一区二区三区久久| 欧美伦理91i| 欧洲精品在线视频| 欧美大片在线影院| 中文字幕精品在线| 亚洲精品日韩欧美| 色综合色综合网色综合| 91极品女神在线| 久久中文字幕国产| 色播久久人人爽人人爽人人片视av| 中文字幕av一区中文字幕天堂| 久久这里有精品视频| 亚洲春色另类小说| 色悠悠久久88| 91久久国产综合久久91精品网站| 91精品国产高清自在线看超| 91精品久久久久久久久青青| 久久精品青青大伊人av| 亚洲国产欧美一区二区三区同亚洲| 亚洲福利视频二区| 亚洲精品网址在线观看| 激情亚洲一区二区三区四区| 欧美日韩国产一中文字不卡| 欧美日本在线视频中文字字幕| 国产偷亚洲偷欧美偷精品| 国产精品美乳在线观看| 欧美黑人性视频| 国产精品黄页免费高清在线观看| 精品久久久久久久久中文字幕| 国产手机视频精品| 国产视频精品xxxx| 国产精品专区一| 欧美尤物巨大精品爽| 97国产真实伦对白精彩视频8| 97视频免费看| 欧美日韩免费在线| 日韩一区二区三区国产| 亚洲成年网站在线观看| 91久久久久久久久久| 欧洲亚洲免费视频| 色综合91久久精品中文字幕| 色偷偷偷亚洲综合网另类| 精品视频—区二区三区免费| 欧美亚洲第一区| 国产精品永久在线| 97在线视频一区| 国产成人精品在线| 国产亚洲一级高清| 狠狠爱在线视频一区| 国产精品高潮呻吟视频| 91成人在线观看国产| 久久成人亚洲精品| 精品高清美女精品国产区| 久久成年人免费电影| 国产精品96久久久久久| 日本一区二三区好的精华液| 日韩精品中文字幕有码专区| 久久久久久一区二区三区| 另类视频在线观看| 欧美日韩成人在线视频| 国产ts人妖一区二区三区| 国产香蕉精品视频一区二区三区| 国产午夜精品理论片a级探花| 亚洲欧美综合精品久久成人| 91精品国产综合久久久久久蜜臀| 日韩av电影在线网| 国产91亚洲精品| 98午夜经典影视| 97视频免费在线观看| 欧美在线观看一区二区三区| 色噜噜国产精品视频一区二区| 欧美性xxxxx极品| 欧美韩日一区二区| 91香蕉嫩草神马影院在线观看| 97精品久久久| 亚洲第一免费播放区| 欧美日韩成人精品| 久久久久国产精品免费| 国产美女久久精品香蕉69| 色av中文字幕一区| 亚洲国模精品一区| 在线精品高清中文字幕| 最近2019年日本中文免费字幕| 综合网日日天干夜夜久久| 亚洲一区二区少妇| 国产丝袜一区二区| 欧美与黑人午夜性猛交久久久| 在线精品视频视频中文字幕| 亚洲男人天堂久|