1. 程式人生 > >Swift學習筆記(六)列舉型別

Swift學習筆記(六)列舉型別

列舉型別

列舉語法

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

注意:與C或者Objective-C不同的是,在Swift語言中列舉型別的成員初始的時候不會被預設賦值成整數值,在CompassPoint這個例子中,North, South, East, West預設不會隱式的等於0,1,2,3。取而代之的是不同的列舉成員將要用什麼型別以及賦值什麼值都是可以自己控制的,可以在定義CompassPoint這個列舉的時候指定.

多個成員還可以用一行來定義,他們之間用逗號分割

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

每個列舉的定義都是定義了一個全新的型別,就像Swfit中的其他的型別一樣,列舉的名稱(CompassPoint, Plant)應該是以一個大寫字母開頭,讓他們是單數型別而不是複數型別,從而讓他們可以不言而喻。

var directionToHead = CompassPoint.West

directionToHead在初始化過程中被賦值成CompassPoint中的某一個可能的值的時候,它的型別就可以被推測出來來了。一旦directionToHead被宣告成是CompassPoint型別,那麼你就可以簡短的使用逗號表示式來給它賦值成其他的CompassPoint當中的值了:

directionToHead = .East

Switch語句來匹配列舉
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")
}
// prints "Watch out for penguins"


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

關聯值

Swift中當你定義一個列舉成員的時候,你可以給他關聯任何的型別,而且如果需要的話每個成員可以有不同的關聯型別。列舉型別的這個特性和其他語言當中的辨別聯合,標記聯合或者變體很像。

一個可以定義兩個格式的產品條形碼的列舉看起來是這樣的:

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

可以這麼理解

定義了一個叫做Barcode的列舉型別,它可以有一個UPCA成員,這個成員關聯了一個包含4個整型數值的元組,同時這個列舉型別還有一個QRCode成員,關聯了一個字串

這個定義不會生成任何的整型或者字串值,他只是定義了當一個不可變變數或者變數等於Barcode.UPCA或者Barcode.QRCode的時候它被關聯的值的型別

var productBarcode = Barcode.UPCA(8, 85909, 51226, 3)
productBarcode = .QRCode("ABCDEFGHIJKLMNOPQRST")

這兩個不同的型別可以用Switch語句來做檢查。同時,在switch語句中他們相關聯的值也可以被獲取到。你可以把關聯的值當做不可變變數(let來開頭),或者可變變數(var開頭)以在switch的控制體當中使用。

switch productBarcode {
case .UPCA(let numberSystem, let manufacturer, let product, let check):
    println("UPC-A: \(numberSystem), \(manufacturer), \(product), \(check).")
case .QRCode(let productCode):
    println("QR code: \(productCode).")
}
// prints "QR code: ABCDEFGHIJKLMNOP."

如果一個列舉成員關聯的所有值都被當做不可變變數或者可變變數來使用,那麼你可以在成員名稱之前只放一個let或者var來達到目的

switch productBarcode {
case let .UPCA(numberSystem, manufacturer, product, check):
    println("UPC-A: \(numberSystem), \(manufacturer), \(product), \(check).")
case let .QRCode(productCode):
    println("QR code: \(productCode).")
}
// prints "QR code: ABCDEFGHIJKLMNOP."

原始值(Raw Values)

不同於關聯值,列舉型別的成員還可以預設定預設值(我們叫他原始值),這些值的型別是相同的。

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

注意:原始值與關聯值不同。原始值應該是在你定義列舉的程式碼中被設定為預填充值的,就像上述三個ASCII碼。對於一個特定的列舉成員的原始值始終是相同的。關聯值是當你建立一個基於列舉的成員的新的常量或變數的時候設定的,並且每次都可以是不同的。

原始值可以是字串,字元或者其他任何的整型或者浮點型等數字型別。每個原始值在他屬的列舉型別定義的時候都應該是不同的。如果原始值是整數型別,那麼當其他列舉成員沒有設定原始值的時候,他們的原始值是這個整型原始值自增長設定的。

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

獲取原始值

let earthOrder = Planet.Earth.rawValue
earthsOrder is 3

rawValue初始化

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

不是所有可能int值都能找到一個匹配的Planet,所以,原始值初始化常常返回一個可選的列舉成員,上面的possiblePlanet的型別是Planet?

如果你試圖去找到一個在位置9Planet,這個可選的Planet值通過原始值去初始化將返回nil

let positionToFind = 9
if let somePlanet = Planet(rawValue: 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)")
}
// prints "There isn't a planet at position 9"

相關推薦

Swift學習筆記()列舉型別

列舉型別 列舉語法 enum CompassPoint { case North case South case East case West } 注意:與C或者Objective-C不同的是,在Swift語言中列舉型別的成員初始的時候不會

Swift學習筆記:常見概念(一)

七、常見概念1.範圍Range、ClosedRange和NSRange的使用//區間分為閉區間和半開區間import Foundationlet closedRange: ClosedRange = 1...3 //閉區間let intArray = ["1", "2", "

Java學習筆記()--包裝類、基本型別、拆箱、裝箱

基本型別與包裝類        1.java中包括8個基本型別,與之對應的有8個包裝型別,包裝類是針對原生資料型別的包裝                       基本型別                          包裝型別byteByte(Number的子類)sh

Swift學習筆記()——函式

函式  懂程式語言的來說這個是最基本的了,任何語言都有函式這個概念,函式就是完成特定任務的獨立程式碼塊。 函式怎麼建立: 1、建立一個無參無返回值的函式(實際上所有的函式都有返回值,這個函式返回void,它是一個空元組) func testFunc(){ }

Swift學習筆記(一)——Swift的資料型別

Swift的資料型別 Swift 的型別是在 C 和 Objective-C 的基礎上提出的,Int是整型;Double和Float是浮點型;Bool是布林型;String是字串。Swift 還有兩個有⽤用的集合型別, Array和Dictionary, 除了我們熟悉的型別

繼承—Swift學習筆記(十

注:本文為自己學習The Swift Programming Language的筆記,其中的例子為引用原書和其他博文或自己原創的。每個例子都會批註一些實踐過程中的經驗或思考總結。 1.基礎 一個類可以繼承另外一個類的方法、屬性或者其他特性,繼承其他類的類叫做子類(subcl

Swift學習筆記(4):字符串

min mes 不同的 常用方法 dice 內存空間 全部 there logs 目錄: 初始化 常用方法或屬性 字符串索引 初始化 創建一個空字符串作為初始值: var emptyString = "" // 空字

Swift學習筆記(5):集合類型

nbsp roc 三種 一個 刪除指定元素 edge 空值 port 自定義 目錄: 數組:Array 集合:Set 字典:Dictionary Swift提供Array(有序集合數據)、Set(無序無重復集合)和Dictionary(無序鍵值對集合)三

Swift學習筆記(8):枚舉

check oss 函數 not 條形碼 blog 出現 現在 pan 目錄: 基本語法 關聯值 原始值 枚舉為一組相關的值定義了一個共同的類型。 ?可以給枚舉成員指定原始值類型:字符串,字符,整型值或浮點數等 ?枚舉成員可以指定任意類型的關聯值存儲

Python學習筆記:文件處理

alt 筆記 lin 系統 顯式 當前位置 open 刷新 大小 一:打開文件 open(name,mode,[bufferSize]) name:文件路徑 mode:文件打開方式 二:文件讀取 read()方法:可以一次讀取文件的全部內容,Python把內容讀到

swift學習筆記(五)構造過程

不能 學習筆記 結構體 rri -a 依據 類的屬性 去掉 trac 構造過程是為了使用某個類、結構體或枚舉類型的實例而進行的準備過程。在構造過程中,對每一個屬性進行了初始值預設和其它必要的準備和初始化工作。 與OC相比,swift的構造函數。不須要返回值。同一時候,在

Swift學習筆記(二十二)——字典的基本操作

post content 相同 技術分享 eval clas track targe 返回值 (1)計算字典長度 。 (2)推斷字典是否為空 。 (3)查詢字典元素 。 (4)取出字典元素進行拼接 。 (5)字典中插入一個鍵值對 。 (6)字典改動某

Android第一行代碼學習筆記---Intent向活動傳遞數據

一行 而已 activity ase 是否 button can ride 重載 @1、向下一個活動傳遞數據: Intent提供了一系列putExtra()方法的重載,可以把我們想要傳遞的數據暫存在Intent中,啟動了另一個活動後,只需把這些數據再從Intent中取出就可

Swift學習筆記之閉包

pps eap animate nbsp ssi apps arr 全局 mef 簡介 (真的很簡) 閉包的完整形態是這個樣子的: { (parameters) -> returnType in statements } 寫在一行裏就是

SWIFT學習筆記05

print 類型 class log else 2014年 with sni swe 1、Swift 無需寫break,所以不會發生這樣的貫穿(fallthrough)的情況。2、//用不到變量名,可用“_”替換 for _ in 1...power {

<Bootstrap> 學習筆記. 柵格系統使用案例

柵格 3.2 btn nta head ext ont ces str <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <t

Linux學習筆記()---Xshell通過公鑰連接CentOS系統

工具 fff bdc 長度 遠程服務器 遠程服務 size 服務器 安全性 前面我們通過ssh,使用服務器端用戶名和密碼遠程連接CentOS系統。這種方式還不夠安全,為了提高連接訪問的安全性,建議使用密鑰認證。具體的操作及配置如下:1.在Xshell中創建密鑰對(公鑰和私鑰

AWS學習筆記()--利用CloudFormation管理AWS資源

view sdm ces top 結構 iat param nfs-utils creat CloudFormation是管理AWS資源的一項服務。你可以創建一個Template,其中包括所有用到的資源(VPC、EC2、RDS等)。Template支持參數化,可根據條件創建

netty權威指南學習筆記——編解碼技術之MessagePack

ssi add java exception 字節數組 ted evel thrift 發送   編解碼技術主要應用在網絡傳輸中,將對象比如BOJO進行編解碼以利於網絡中進行傳輸。平常我們也會將編解碼說成是序列化/反序列化   定義:當進行遠程跨進程服務調用時,需要把被傳輸

scala 學習筆記 推導

表達式 過濾 一個 mage 介紹 val 關鍵字 定義 循環   1、介紹     在Scala中,推導將生成器、過濾器、和定義組合在一起。   2、例子          有一種將result用作val(而不是var)的方式,:“就地&rdqu