Swift3.1_枚舉

枚舉

定義和使用

使用enum關(guān)鍵詞來創(chuàng)建枚舉并且把它們的整個(gè)定義放在一對(duì)大括號(hào)內(nèi),使用case關(guān)鍵字來定義一個(gè)新的枚舉成員值。

enum CompassPoint {
    case north
    case south
    case east
    case west
}

使用

let direction: CompassPoint = .north

使用Switch語句匹配枚舉值

case .north:
    print("direction is north")
case .south:
    print("direction is south")
case .east:
    print("direction is east")
case .west:
    print("direction is west")
}

關(guān)聯(lián)值

你可以定義Swift枚舉來存儲(chǔ)任意類型的關(guān)聯(lián)值建邓,如果需要的話,每個(gè)枚舉成員的關(guān)聯(lián)值類型可以各不相同尔许。枚舉的這種特性跟其他語言中的可識(shí)別聯(lián)合discriminated unions睛低,標(biāo)簽聯(lián)合tagged unions,或者變體variants相似磕昼。

定義一個(gè)名為Barcode的枚舉類型卷雕,它的一個(gè)成員值是具有(Int,Int票从,Int漫雕,Int)類型關(guān)聯(lián)值的upc,另一個(gè)成員值是具有String類型關(guān)聯(lián)值的qrCode峰鄙。

enum Barcode {
    case upc(Int, Int, Int, Int)
    case qrCode(String)
}

然后可以使用任意一種條形碼類型創(chuàng)建新的條形碼浸间,例如:

var productBarcode = Barcode.upc(8, 0085, 2106, 3)

同一個(gè)商品可以被分配一個(gè)不同類型的條形碼,例如:

productBarcode = Barcode.qrCode("ABCDEFGHIJKLMNOP")

原始值

枚舉成員可以被默認(rèn)值(稱為原始值)預(yù)填充吟榴,這些原始值的類型必須相同魁蒜。

enum ASCIIControlCharacter: Character {
    case tab = "\t"
    case lineFeed = "\n"
    case carriageReturn = "\r"
}
原始值的隱式賦值

在使用原始值為整數(shù)或者字符串類型的枚舉時(shí),不需要顯式地為每一個(gè)枚舉成員設(shè)置原始值吩翻,Swift將會(huì)自動(dòng)為你賦值兜看。

enum Planet: Int {
    case mercury = 1, venus, earth, mars, jupiter, saturn, uranus, neptune
}

Plant.mercury的顯式原始值為1Planet.venus的隱式原始值為2狭瞎,依次類推细移。

使用原始值初始化枚舉實(shí)例

如果在定義枚舉類型的時(shí)候使用了原始值,那么將會(huì)自動(dòng)獲得一個(gè)初始化方法熊锭,這個(gè)方法接收一個(gè)叫做rawValue的參數(shù)弧轧,參數(shù)類型即為原始值類型缔刹,返回值則是枚舉成員或nil。你可以使用這個(gè)初始化方法來創(chuàng)建一個(gè)新的枚舉實(shí)例劣针。

let possiblePlanet = Planet(rawValue: 7)
// possiblePlanet 類型為 Planet? 值為 Planet.uranus

let impossiblePlanet = Planet(rawValue: 11)
print(impossiblePlanet as Any)  // nil

遞歸枚舉

遞歸枚舉是一種枚舉類型校镐,它有一個(gè)或多個(gè)枚舉成員使用該枚舉類型的實(shí)例作為關(guān)聯(lián)值。使用遞歸枚舉時(shí)捺典,編譯器會(huì)插入一個(gè)間接層鸟廓。你可以在枚舉成員前加上indirect來表示該成員可遞歸。

例如襟己,下面的例子中引谜,枚舉類型存儲(chǔ)了簡單的算術(shù)表達(dá)式:

enum ArithmeticExpression {
    case number(Int)
    indirect case addition(ArithmeticExpression, ArithmeticExpression)
    indirect case multiplication(ArithmeticExpression, ArithmeticExpression)
}

你也可以在枚舉類型開頭加上indirect關(guān)鍵字來表明它的所有成員都是可遞歸的:

indirect enum ArithmeticExpression {
    case number(Int)
    case addition(ArithmeticExpression, ArithmeticExpression)
    case multiplication(ArithmeticExpression, ArithmeticExpression)
}

上面定義的枚舉類型可以存儲(chǔ)三種算術(shù)表達(dá)式:純數(shù)字、兩個(gè)表達(dá)式相加擎浴、兩個(gè)表達(dá)式相乘员咽。

let five = ArithmeticExpression.number(5)
let four = ArithmeticExpression.number(4)
let sum = ArithmeticExpression.addition(five, four)
let product = ArithmeticExpression.multiplication(sum, ArithmeticExpression.number(2))

要操作具有遞歸性質(zhì)的數(shù)據(jù)結(jié)構(gòu),使用遞歸函數(shù)是一種直截了當(dāng)?shù)姆绞街ぁ@绫词遥旅媸且粋€(gè)對(duì)算術(shù)表達(dá)式求值的函數(shù):

func evaluate(_ expression: ArithmeticExpression) -> Int {
    switch expression {
    case let .number(value):
        return value
    case let .addition(left, right):
        return evaluate(left) + evaluate(right)
    case let .multiplication(left, right):
        return evaluate(left) * evaluate(right)
    }
}
print(evaluate(product))
// 打印 "18"

該函數(shù)如果遇到純數(shù)字,就直接返回該數(shù)字的值仿吞。如果遇到的是加法或乘法運(yùn)算滑频,則分別計(jì)算左邊表達(dá)式和右邊表達(dá)式的值,然后相加或相乘唤冈。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末峡迷,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子你虹,更是在濱河造成了極大的恐慌绘搞,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,451評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件傅物,死亡現(xiàn)場離奇詭異夯辖,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)挟伙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,172評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門楼雹,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人尖阔,你說我怎么就攤上這事贮缅。” “怎么了介却?”我有些...
    開封第一講書人閱讀 164,782評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵谴供,是天一觀的道長。 經(jīng)常有香客問我齿坷,道長桂肌,這世上最難降的妖魔是什么数焊? 我笑而不...
    開封第一講書人閱讀 58,709評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮崎场,結(jié)果婚禮上佩耳,老公的妹妹穿的比我還像新娘。我一直安慰自己谭跨,他們只是感情好干厚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,733評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著螃宙,像睡著了一般蛮瞄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上谆扎,一...
    開封第一講書人閱讀 51,578評(píng)論 1 305
  • 那天挂捅,我揣著相機(jī)與錄音,去河邊找鬼堂湖。 笑死闲先,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的苗缩。 我是一名探鬼主播饵蒂,決...
    沈念sama閱讀 40,320評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼声诸,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼酱讶!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起彼乌,我...
    開封第一講書人閱讀 39,241評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤泻肯,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后慰照,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灶挟,經(jīng)...
    沈念sama閱讀 45,686評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,878評(píng)論 3 336
  • 正文 我和宋清朗相戀三年毒租,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了稚铣。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,992評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡墅垮,死狀恐怖惕医,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情算色,我是刑警寧澤抬伺,帶...
    沈念sama閱讀 35,715評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站灾梦,受9級(jí)特大地震影響峡钓,放射性物質(zhì)發(fā)生泄漏妓笙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,336評(píng)論 3 330
  • 文/蒙蒙 一能岩、第九天 我趴在偏房一處隱蔽的房頂上張望寞宫。 院中可真熱鬧,春花似錦拉鹃、人聲如沸淆九。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,912評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炭庙。三九已至,卻和暖如春煌寇,著一層夾襖步出監(jiān)牢的瞬間焕蹄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,040評(píng)論 1 270
  • 我被黑心中介騙來泰國打工阀溶, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留腻脏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,173評(píng)論 3 370
  • 正文 我出身青樓银锻,卻偏偏與公主長得像永品,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子击纬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,947評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 本章將會(huì)介紹 閉包表達(dá)式尾隨閉包值捕獲閉包是引用類型逃逸閉包自動(dòng)閉包枚舉語法使用Switch語句匹配枚舉值關(guān)聯(lián)值原...
    寒橋閱讀 1,559評(píng)論 0 3
  • 枚舉為一組相關(guān)的值定義了一個(gè)共同的類型更振,使得可以在代碼中以類型安全的方式來使用這些值炕桨。 如果熟悉 C 語言,會(huì)知道...
    窮人家的孩紙閱讀 854評(píng)論 1 4
  • 枚舉為一組相關(guān)的值定義了一個(gè)共同的類型肯腕,使你可以在你的代碼中以類型安全的方式來使用這些值献宫。 如果你熟悉 C 語言,...
    雨影閱讀 349評(píng)論 0 0
  • 天冷了实撒,又下起了小雨姊途,這個(gè)世界顯得更冷了。 不知道你那邊的天氣怎么樣知态,是不是也是這么冷捷兰?是不是也在下著雨? 此刻肴甸,...
    向著太陽奔跑的石頭閱讀 462評(píng)論 0 0
  • 世界觀:關(guān)于世界的根本看法寂殉;人生觀:關(guān)于人生的看法;價(jià)值觀:回答在人生當(dāng)中什么事認(rèn)為值得或不值得的原在,以及它的價(jià)值大小友扰。
    目標(biāo)感閱讀 117評(píng)論 0 0