成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

2.8枚舉(Enumerations)-創(chuàng)新互聯(lián)

本頁(yè)內(nèi)容包含:

網(wǎng)站建設(shè)哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、微信小程序、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了洪江免費(fèi)建站歡迎大家使用!
  • 枚舉語(yǔ)法(Enumeration Syntax)

  • 匹配枚舉值與Swith語(yǔ)句(Matching Enumeration Values with a Switch Statement)

  • 相關(guān)值(Associated Values)

  • 原始值(Raw Values)

枚舉定義了一個(gè)通用類型的一組相關(guān)的值,使你可以在你的代碼中以一個(gè)安全的方式來(lái)使用這些值。

如果你熟悉 C 語(yǔ)言,你就會(huì)知道,在 C 語(yǔ)言中枚舉指定相關(guān)名稱為一組整型值。Swift 中的枚舉更加靈活,不必給每一個(gè)枚舉成員提供一個(gè)值。如果一個(gè)值(被認(rèn)為是“原始”值)被提供給每個(gè)枚舉成員,則該值可以是一個(gè)字符串,一個(gè)字符,或是一個(gè)整型值或浮點(diǎn)值。

此外,枚舉成員可以指定任何類型的相關(guān)值存儲(chǔ)到枚舉成員值中,就像其他語(yǔ)言中的聯(lián)合體(unions)和變體(variants)。你可以定義一組通用的相關(guān)成員作為枚舉的一部分,每一組都有不同的一組與它相關(guān)的適當(dāng)類型的數(shù)值。

在 Swift 中,枚舉類型是一等(first-class)類型。它們采用了很多傳統(tǒng)上只被類(class)所支持的特征,例如計(jì)算型屬性(computed properties),用于提供關(guān)于枚舉當(dāng)前值的附加信息, 實(shí)例方法(instance methods),用于提供和枚舉所代表的值相關(guān)聯(lián)的功能。枚舉也可以定義構(gòu)造函數(shù)(initializers)來(lái)提供一個(gè)初始成員值;可以在原始的實(shí)現(xiàn)基礎(chǔ)上擴(kuò)展它們的功能;可以遵守協(xié)議(protocols)來(lái)提供標(biāo)準(zhǔn)的功能。

欲了解更多相關(guān)功能,請(qǐng)參見(jiàn)屬性(Properties),方法(Methods),構(gòu)造過(guò)程(Initialization),擴(kuò)展(Extensions)和協(xié)議(Protocols)。

枚舉語(yǔ)法

使用enum關(guān)鍵詞并且把它們的整個(gè)定義放在一對(duì)大括號(hào)內(nèi):

enum SomeEnumeration {
  // enumeration definition goes here
}

以下是指南針?biāo)膫€(gè)方向的一個(gè)例子:

enum CompassPoint {
  case North
  case South
  case East
  case West
}

一個(gè)枚舉中被定義的值(例如 NorthSouth,EastWest)是枚舉的成員值(或者成員)。case關(guān)鍵詞表明新的一行成員值將被定義。

注意:
不像 C 和 Objective-C 一樣,Swift 的枚舉成員在被創(chuàng)建時(shí)不會(huì)被賦予一個(gè)默認(rèn)的整數(shù)值。在上面的CompassPoints例子中,North,South,EastWest不是隱式的等于01,23。相反的,這些不同的枚舉成員在CompassPoint的一種顯示定義中擁有各自不同的值。

多個(gè)成員值可以出現(xiàn)在同一行上,用逗號(hào)隔開(kāi):

enum Planet {
  case Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}

每個(gè)枚舉定義了一個(gè)全新的類型。像 Swift 中其他類型一樣,它們的名字(例如CompassPointPlanet)必須以一個(gè)大寫字母開(kāi)頭。給枚舉類型起一個(gè)單數(shù)名字而不是復(fù)數(shù)名字,以便于讀起來(lái)更加容易理解:

var directionToHead = CompassPoint.West

directionToHead的類型被推斷當(dāng)它被CompassPoint的一個(gè)可能值初始化。一旦directionToHead被聲明為一個(gè)CompassPoint,你可以使用更短的點(diǎn)(.)語(yǔ)法將其設(shè)置為另一個(gè)CompassPoint的值:

directionToHead = .East

directionToHead的類型已知時(shí),當(dāng)設(shè)定它的值時(shí),你可以不再寫類型名。使用顯式類型的枚舉值可以讓代碼具有更好的可讀性。

匹配枚舉值和Switch語(yǔ)句

你可以匹配單個(gè)枚舉值和switch語(yǔ)句:

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”

你可以如此理解這段代碼:

“考慮directionToHead的值。當(dāng)它等于.North,打印“Lots of planets have a north”。當(dāng)它等于.South,打印“Watch out for penguins”?!?/p>

等等依次類推。

正如在控制流(Control Flow)中介紹,當(dāng)考慮一個(gè)枚舉的成員們時(shí),一個(gè)switch語(yǔ)句必須全面。如果忽略了.West這種情況,上面那段代碼將無(wú)法通過(guò)編譯,因?yàn)樗鼪](méi)有考慮到CompassPoint的全部成員。全面性的要求確保了枚舉成員不會(huì)被意外遺漏。

當(dāng)不需要匹配每個(gè)枚舉成員的時(shí)候,你可以提供一個(gè)默認(rèn)default分支來(lái)涵蓋所有未明確被提出的任何成員:

let somePlanet = Planet.Earth
switch somePlanet {
case .Earth:
    println("Mostly harmless")
default:
    println("Not a safe place for humans")
}
// 輸出 "Mostly harmless”

相關(guān)值(Associated Values)

上一小節(jié)的例子演示了一個(gè)枚舉的成員是如何被定義(分類)的。你可以為Planet.Earth設(shè)置一個(gè)常量或則變量,并且在之后查看這個(gè)值。不管怎樣,如果有時(shí)候能夠把其他類型的相關(guān)值和成員值一起存儲(chǔ)起來(lái)會(huì)很有用。這能讓你存儲(chǔ)成員值之外的自定義信息,并且當(dāng)你每次在代碼中使用該成員時(shí)允許這個(gè)信息產(chǎn)生變化。

你可以定義 Swift 的枚舉存儲(chǔ)任何類型的相關(guān)值,如果需要的話,每個(gè)成員的數(shù)據(jù)類型可以是各不相同的。枚舉的這種特性跟其他語(yǔ)言中的可辨識(shí)聯(lián)合(discriminated unions),標(biāo)簽聯(lián)合(tagged unions),或者變體(variants)相似。

例如,假設(shè)一個(gè)庫(kù)存跟蹤系統(tǒng)需要利用兩種不同類型的條形碼來(lái)跟蹤商品。有些商品上標(biāo)有 UPC-A 格式的一維碼,它使用數(shù)字 0 到 9。每一個(gè)條形碼都有一個(gè)代表“數(shù)字系統(tǒng)”的數(shù)字,該數(shù)字后接 10 個(gè)代表“標(biāo)識(shí)符”的數(shù)字。最后一個(gè)數(shù)字是“檢查”位,用來(lái)驗(yàn)證代碼是否被正確掃描:

2.8 枚舉(Enumerations)

其他商品上標(biāo)有 QR 碼格式的二維碼,它可以使用任何 ISO8859-1 字符,并且可以編碼一個(gè)最多擁有 2,953 字符的字符串:

2.8 枚舉(Enumerations)

對(duì)于庫(kù)存跟蹤系統(tǒng)來(lái)說(shuō),能夠把 UPC-A 碼作為三個(gè)整型值的元組,和把 QR 碼作為一個(gè)任何長(zhǎng)度的字符串存儲(chǔ)起來(lái)是方便的。

在 Swift 中,用來(lái)定義兩種商品條碼的枚舉是這樣子的:

enum Barcode {
  case UPCA(Int, Int, Int)
  case QRCode(String)
}

以上代碼可以這么理解:

“定義一個(gè)名為Barcode的枚舉類型,它可以是UPCA的一個(gè)相關(guān)值(IntInt,Int),或者QRCode的一個(gè)字符串類型(String)相關(guān)值?!?/p>

這個(gè)定義不提供任何IntString的實(shí)際值,它只是定義了,當(dāng)Barcode常量和變量等于Barcode.UPCABarcode.QRCode時(shí),相關(guān)值的類型。

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

var productBarcode = Barcode.UPCA(8, 85909_51226, 3)

以上例子創(chuàng)建了一個(gè)名為productBarcode的新變量,并且賦給它一個(gè)Barcode.UPCA的相關(guān)元組值(8, 8590951226, 3)。提供的“標(biāo)識(shí)符”值在整數(shù)字中有一個(gè)下劃線,使其便于閱讀條形碼。

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

productBarcode = .QRCode("ABCDEFGHIJKLMNOP")

這時(shí),原始的Barcode.UPCA和其整數(shù)值被新的Barcode.QRCode和其字符串值所替代。條形碼的常量和變量可以存儲(chǔ)一個(gè).UPCA或者一個(gè).QRCode(連同它的相關(guān)值),但是在任何指定時(shí)間只能存儲(chǔ)其中之一。

像以前那樣,不同的條形碼類型可以使用一個(gè) switch 語(yǔ)句來(lái)檢查,然而這次相關(guān)值可以被提取作為 switch 語(yǔ)句的一部分。你可以在switch的 case 分支代碼中提取每個(gè)相關(guān)值作為一個(gè)常量(用let前綴)或者作為一個(gè)變量(用var前綴)來(lái)使用:

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.”

如果一個(gè)枚舉成員的所有相關(guān)值被提取為常量,或者它們?nèi)勘惶崛樽兞?,為了?jiǎn)潔,你可以只放置一個(gè)var或者let標(biāo)注在成員名稱前:

switch productBarcode {
case let .UPCA(numberSystem, identifier, check):
    println("UPC-A with value of \(numberSystem), \(identifier), \(check).")
case let .QRCode(productCode):
    println("QR code with value of \(productCode).")
}
// 輸出 "QR code with value of ABCDEFGHIJKLMNOP."

原始值(Raw Values)

在Associated Values小節(jié)的條形碼例子中演示了一個(gè)枚舉的成員如何聲明它們存儲(chǔ)不同類型的相關(guān)值。作為相關(guān)值的替代,枚舉成員可以被默認(rèn)值(稱為原始值)預(yù)先填充,其中這些原始值具有相同的類型。

這里是一個(gè)枚舉成員存儲(chǔ)原始 ASCII 值的例子:

enum ASCIIControlCharacter: Character {
    case Tab = "\t"
    case LineFeed = "\n"
    case CarriageReturn = "\r"
}

在這里,稱為ASCIIControlCharacter的枚舉的原始值類型被定義為字符型Character,并被設(shè)置了一些比較常見(jiàn)的 ASCII 控制字符。字符值的描述請(qǐng)?jiān)斠?jiàn)字符串和字符Strings and Characters部分。

注意,原始值和相關(guān)值是不相同的。當(dāng)你開(kāi)始在你的代碼中定義枚舉的時(shí)候原始值是被預(yù)先填充的值,像上述三個(gè) ASCII 碼。對(duì)于一個(gè)特定的枚舉成員,它的原始值始終是相同的。相關(guān)值是當(dāng)你在創(chuàng)建一個(gè)基于枚舉成員的新常量或變量時(shí)才會(huì)被設(shè)置,并且每次當(dāng)你這么做得時(shí)候,它的值可以是不同的。

原始值可以是字符串,字符,或者任何整型值或浮點(diǎn)型值。每個(gè)原始值在它的枚舉聲明中必須是唯一的。當(dāng)整型值被用于原始值,如果其他枚舉成員沒(méi)有值時(shí),它們會(huì)自動(dòng)遞增。

下面的枚舉是對(duì)之前Planet這個(gè)枚舉的一個(gè)細(xì)化,利用原始整型值來(lái)表示每個(gè) planet 在太陽(yáng)系中的順序:

enum Planet: Int {
    case Mercury = 1, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune
}

自動(dòng)遞增意味著Planet.Venus的原始值是2,依次類推。

使用枚舉成員的toRaw方法可以訪問(wèn)該枚舉成員的原始值:

let earthsOrder = Planet.Earth.toRaw()
// earthsOrder is 3

使用枚舉的fromRaw方法來(lái)試圖找到具有特定原始值的枚舉成員。這個(gè)例子通過(guò)原始值7識(shí)別Uranus

let possiblePlanet = Planet.fromRaw(7)
// possiblePlanet is of type Planet? and equals Planet.Uranus

然而,并非所有可能的Int值都可以找到一個(gè)匹配的行星。正因?yàn)槿绱耍?code>fromRaw方法可以返回一個(gè)可選的枚舉成員。在上面的例子中,possiblePlanetPlanet?類型,或“可選的Planet”。

如果你試圖尋找一個(gè)位置為9的行星,通過(guò)fromRaw返回的可選Planet值將是nil

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)")
}
// 輸出 "There isn't a planet at position 9

這個(gè)范例使用可選綁定(optional binding),通過(guò)原始值9試圖訪問(wèn)一個(gè)行星。if let somePlanet = Planet.fromRaw(9)語(yǔ)句獲得一個(gè)可選Planet,如果可選Planet可以被獲得,把somePlanet設(shè)置成該可選Planet的內(nèi)容。在這個(gè)范例中,無(wú)法檢索到位置為9的行星,所以else分支被執(zhí)行。

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)頁(yè)標(biāo)題:2.8枚舉(Enumerations)-創(chuàng)新互聯(lián)
標(biāo)題網(wǎng)址:http://jinyejixie.com/article26/dehdcg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站改版網(wǎng)站設(shè)計(jì)、網(wǎng)站策劃、手機(jī)網(wǎng)站建設(shè)、微信公眾號(hào)網(wǎng)站內(nèi)鏈

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

綿陽(yáng)服務(wù)器托管
东乌珠穆沁旗| 庐江县| 成都市| 塔城市| 德江县| 宣恩县| 德清县| 涿鹿县| 洪湖市| 彩票| 东乡族自治县| 静海县| 含山县| 桃江县| 台湾省| 东辽县| 通城县| 屯门区| 南皮县| 通州市| 六安市| 大宁县| 凌源市| 鹤岗市| 舟曲县| 札达县| 台前县| 扬中市| 阿尔山市| 鄱阳县| 乐东| 宁强县| 新干县| 响水县| 台北县| 马山县| 沙洋县| 镇巴县| 天祝| 建瓯市| 兴国县|