官术网_书友最值得收藏!

6.5 枚舉的原始值與相關(guān)值

枚舉的原始值特性可以將枚舉值與另一種數(shù)據(jù)類(lèi)型進(jìn)行綁定,相關(guān)值則可以為枚舉值關(guān)聯(lián)一些其他數(shù)據(jù)。通過(guò)相關(guān)值,開(kāi)發(fā)者可以實(shí)現(xiàn)復(fù)雜的枚舉類(lèi)型。

6.5.1 枚舉的原始值

上節(jié)中創(chuàng)建的枚舉其實(shí)并沒(méi)有聲明一個(gè)原始值類(lèi)型,Swift語(yǔ)言中的枚舉支持開(kāi)發(fā)者聲明一個(gè)原始類(lèi)型,并將某個(gè)已經(jīng)存在的類(lèi)型的值與枚舉值進(jìn)行綁定,枚舉指定原始值類(lèi)型的語(yǔ)法與繼承的語(yǔ)法有些類(lèi)似,示例如下:

如果開(kāi)發(fā)者要指定枚舉的原始值類(lèi)型為Int類(lèi)型,也可以只設(shè)置第一個(gè)枚舉值的原始值,其后的枚舉值的原始值會(huì)在第一個(gè)枚舉值原始值的基礎(chǔ)上依次遞增,示例如下:

通過(guò)枚舉類(lèi)型中的rawValue屬性來(lái)獲取枚舉的原始值,示例如下:

    //創(chuàng)建枚舉變量
    var char = CharEnum.a
    //獲取char枚舉變量的原始值 "a"
    var rawValue = char.rawValue

在枚舉變量初始化時(shí),開(kāi)發(fā)者可以使用枚舉類(lèi)型加點(diǎn)語(yǔ)法的方式,如果這個(gè)枚舉有指定的原始值,也可以通過(guò)枚舉值的原始值來(lái)完成枚舉實(shí)例的構(gòu)造,示例如下:

    //通過(guò)原始值構(gòu)造枚舉變量 一
    var intEnum = IntEnum(rawValue: 1)

需要注意,通過(guò)原始值進(jìn)行枚舉實(shí)例的構(gòu)造時(shí)是有可能構(gòu)造失敗的,因?yàn)殚_(kāi)發(fā)者傳入的原始值不一定會(huì)對(duì)應(yīng)到某一個(gè)枚舉值。因此這個(gè)方法實(shí)際上返回的是一個(gè)Optional類(lèi)型的可選值,如果構(gòu)造失敗,則會(huì)返回nil。

6.5.2 枚舉的相關(guān)值

Swift語(yǔ)言在很多方面的設(shè)計(jì)都比其他編程語(yǔ)言更加靈活與現(xiàn)代,枚舉的相關(guān)值語(yǔ)法最能夠體現(xiàn)這一特點(diǎn)。

枚舉類(lèi)型的設(shè)計(jì)思路是幫助開(kāi)發(fā)者將一些簡(jiǎn)單的同類(lèi)數(shù)據(jù)進(jìn)行整合。舉個(gè)例子,在游戲類(lèi)軟件的開(kāi)發(fā)中經(jīng)常會(huì)使用到各種物理模型,以形狀為例,開(kāi)發(fā)者通常會(huì)定義一系列的枚舉值作為物理形狀的枚舉,如圓形、三角形、矩形等,示例如下:

上面的代碼進(jìn)行了形狀的定義,但是有一個(gè)問(wèn)題,這種枚舉值的定義方式只適合簡(jiǎn)單數(shù)據(jù)類(lèi)型的定義,而不同的形狀可能需要不同的參數(shù)。例如圓形需要圓心和半徑來(lái)確定,矩形需要中心點(diǎn)與寬高來(lái)確定,三角形需要3個(gè)頂點(diǎn)來(lái)確定。如果對(duì)枚舉類(lèi)型進(jìn)行實(shí)例化,可以根據(jù)不同的形狀設(shè)置不同的參數(shù),那么在使用時(shí)對(duì)開(kāi)發(fā)者來(lái)說(shuō)將十分方便,在Swift語(yǔ)言中,對(duì)枚舉設(shè)置相關(guān)值就可以完成這樣的需求。

在定義枚舉值的時(shí)候,開(kāi)發(fā)者可以為其設(shè)置一個(gè)參數(shù)列表,這個(gè)參數(shù)列表被稱(chēng)為枚舉的相關(guān)值,示例如下:

在創(chuàng)建有相關(guān)值枚舉的時(shí)候,開(kāi)發(fā)者需要提供參數(shù)列表中所需要的參數(shù),示例如下:

在switch-case結(jié)構(gòu)語(yǔ)句中,匹配到枚舉后,可以通過(guò)參數(shù)捕獲的方式來(lái)獲取枚舉實(shí)例的相關(guān)值,這里捕獲到的相關(guān)值參數(shù)可以在開(kāi)發(fā)者的代碼中使用,示例如下:

6.5.3 遞歸枚舉

遞歸枚舉是Swift語(yǔ)言枚舉相關(guān)語(yǔ)法中比較難于理解的一個(gè)語(yǔ)法,但是如果可以將其完全掌握,則可以編寫(xiě)出結(jié)構(gòu)十分優(yōu)美的代碼。要完全明白遞歸枚舉的意義與使用,首先需要明白兩點(diǎn)—遞歸與枚舉實(shí)質(zhì)。

遞歸是一種代碼算法技巧,并不區(qū)分語(yǔ)言,各種高級(jí)語(yǔ)言都可以實(shí)現(xiàn)自己的遞歸算法。簡(jiǎn)單來(lái)說(shuō),遞歸就是程序調(diào)用自身的編程技巧。針對(duì)函數(shù)來(lái)說(shuō),遞歸函數(shù)就是在函數(shù)內(nèi)部進(jìn)行了此函數(shù)本身的調(diào)用。讀者需要注意一點(diǎn),遞歸算法效率十分高,但是其性能資源的耗費(fèi)也十分嚴(yán)重。在大多數(shù)情況下,開(kāi)發(fā)者應(yīng)該盡量避免使用遞歸。前面的章節(jié)中曾經(jīng)使用過(guò)循環(huán)結(jié)構(gòu)來(lái)計(jì)算正整數(shù)的階乘,例如5!=5*4*3*2*1=120,這里我們要使用遞歸算法來(lái)實(shí)現(xiàn)一個(gè)正整數(shù)的階乘,代碼如下:

函數(shù)的功能是進(jìn)行數(shù)據(jù)計(jì)算,遞歸函數(shù)只是使用遞歸的算法來(lái)進(jìn)行數(shù)據(jù)的計(jì)算。枚舉則不同,枚舉的功能是數(shù)據(jù)的描述。例如6.5.2節(jié)中創(chuàng)建的形狀枚舉,其中只是對(duì)幾種形狀的數(shù)據(jù)結(jié)構(gòu)進(jìn)行描述和定義,它并不具有數(shù)據(jù)計(jì)算的功能。遞歸枚舉其實(shí)就是使用遞歸的方式來(lái)進(jìn)行數(shù)據(jù)描述。

使用枚舉描述加、減、乘、除四則表達(dá)式示的例代碼如下:

使用上面創(chuàng)建的枚舉來(lái)描述四則運(yùn)算表達(dá)式,示例如下:

這里讀者需要注意,變量exp1、exp2、exp3、exp4只是四則運(yùn)算表達(dá)式的描述,并沒(méi)有運(yùn)算功能??梢院?jiǎn)單地理解為:Expression枚舉模擬的是一種四則運(yùn)算表達(dá)式類(lèi)型,如果要進(jìn)行運(yùn)算,開(kāi)發(fā)者還需要實(shí)現(xiàn)具體的功能函數(shù)。

可以發(fā)現(xiàn),Expression能夠描述的表達(dá)式只是單運(yùn)算表達(dá)式,不能夠進(jìn)行復(fù)合表達(dá)式的描述,例如對(duì)于((5+5)*2-8)/2表達(dá)式的描述。分析這類(lèi)復(fù)合表達(dá)式,其實(shí)質(zhì)只是將單運(yùn)算表達(dá)式作為計(jì)算的參數(shù)傳入另一個(gè)單運(yùn)算表達(dá)式。類(lèi)比于Swift語(yǔ)言中的枚舉,一個(gè)枚舉值的相關(guān)值類(lèi)型可以設(shè)置為這個(gè)枚舉本身的類(lèi)型,通過(guò)這種遞歸的方式就可以實(shí)現(xiàn)復(fù)合表達(dá)式的描述,將前面創(chuàng)建的Expression枚舉修改如下:

使用indirect關(guān)鍵字修飾的枚舉值表示這個(gè)枚舉值是可遞歸的,即此枚舉值中的相關(guān)值可以使用其枚舉類(lèi)型本身。使用修改后的Expression枚舉來(lái)描述復(fù)合表達(dá)式((5+5)*2-8)/2的代碼如下:

最后得到的變量expFinal就是對(duì)((5+5)*2-8)/2的描述。另外,讀者可以為這四則表達(dá)式枚舉類(lèi)型Expression實(shí)現(xiàn)一個(gè)函數(shù)來(lái)進(jìn)行運(yùn)算,在開(kāi)發(fā)中將描述與運(yùn)算結(jié)合,能夠編寫(xiě)出十分優(yōu)美的代碼,處理遞歸枚舉通常會(huì)采用遞歸函數(shù),函數(shù)方法實(shí)現(xiàn)示例如下:

關(guān)于遞歸枚舉還有一點(diǎn)需要注意,如果一個(gè)枚舉中所有的枚舉值都是可遞歸的,開(kāi)發(fā)者可以直接將整個(gè)枚舉類(lèi)型聲明為可遞歸的,示例如下:

主站蜘蛛池模板: 白银市| 肃北| 保康县| 北票市| 茂名市| 灵川县| 亚东县| 海淀区| 衢州市| 南部县| 辽源市| 定西市| 英德市| 商南县| 长宁区| 逊克县| 成安县| 于田县| 江津市| 波密县| 中方县| 陵川县| 绿春县| 东台市| 灯塔市| 独山县| 二手房| 恩平市| 石嘴山市| 姜堰市| 咸丰县| 铁岭县| 济宁市| 塔城市| 开化县| 开原市| 达拉特旗| 南澳县| 榕江县| 若羌县| 清水河县|