swift 學(xué)習(xí)(9)枚舉(Enumerations)

An enumeration is a list of related values that define a common type and let you work with values in a type-safe way.
枚舉是定義一個(gè)公共類型的相關(guān)值的列表鹰溜,可讓您以類型安全的方式使用值虽填。

聲明枚舉

enum Month {
  case january
  case february
  case march
  case april
  case may
  case june
  case july
  case august
  case september
  case october
  case november
  case december
}

enum Month {
  case january, february, march, april, may, june, july, august,
  september, october, november, december
}

聲明帶有計(jì)算屬性的枚舉

enum Month {
    case january, february, march, april, may, june, july, august,
    september, october, november, december
    //let semester = month.semester // "Autumn"
    var semester : String {
        switch self {
        case .august, .september, .october, .november, .december:
            return "Autumn"
        case .january, .february, .march, .april, .may:
            return "Spring"
        case .june, .july:
            return "Summer"
        }
    }
    
}
var month = Month.april
month = .september
let semester = month.semester // "Autumn"

Raw values

Unlike enumeration values in C, Swift enum values are not backed by integers as a default.
與C中的枚舉值不同,Swift枚舉值默認(rèn)不支持整數(shù)曹动。

需要手動(dòng)設(shè)定

enum Month: Int {
  case january = 1, february, march, april, may, june, july,
  august, september, october, november, december
}

Month.october.rawValue // 10

Initializing with the raw value

let fifthMonth = Month(rawValue: 5)
monthsUntilWinterBreak(from: fifthMonth) // Error: value not unwrapped

 let fifthMonth = Month(rawValue: 5)!
monthsUntilWinterBreak(from: fifthMonth)  // 7

String raw values

enum Icon: String {
  case music
  case sports
  case weather
  var filename: String {
    // 2
    return "\(rawValue.capitalized).png"
  }
}
let icon = Icon.weather
icon.filename // Weather.png

Associated values

  • 每個(gè)枚舉值都有0個(gè)或者多個(gè)關(guān)聯(lián)值
  • 每個(gè)枚舉值的關(guān)聯(lián)值都有自己的數(shù)據(jù)類型
  • 你可以像定義方法參數(shù)一樣定義關(guān)聯(lián)值
enum WithdrawalResult {
  case success(newBalance: Int)
  case error(message: String)
}

let result = WithdrawalResult.success(newBalance: 100)
//let result = WithdrawalResult.error(message: "測試錯(cuò)誤數(shù)據(jù)")

switch result {
case .success(let newBalance):
    print("Your new balance is: \(newBalance)")
case .error(let message):
    print(message)
}


switch result {
case .success(let newBalance):
  print("Your new balance is: \(newBalance)")
case .error(let message):
  print(message)
}

//多個(gè)關(guān)聯(lián)值
enum WithdrawalResult {
    case success(newBalance: Int,parameters: Int)
    case error(message: String)
}

特殊的條件判斷

enum HTTPMethod {
  case get
  case post(body: String)
}

let request = HTTPMethod.post(body: "Hi there")
/* 
 In this code, guard case checks to see 
 if request contains the post enumeration case and if so,
 reads and binds the associated value.
 guard case 判斷 request 是否是post 斋日,如果是post,讀取并且關(guān)聯(lián)值到body
 */
guard case .post(let body) = request else {
  fatalError("No message was posted")
}
print(body)

//與上面語句判斷等同
if case .post(let body) = request  {
    print(body)

}

Optionals
Optionals 的底層實(shí)現(xiàn)就是枚舉墓陈,只是編譯器隱藏了實(shí)現(xiàn)細(xì)節(jié)恶守,包括可選值綁定 ? 和 贡必! 操作符孙乖,以及nil的實(shí)現(xiàn)栈源。

var age: Int?
age = 17
age = nil

switch age {
case .none:
  print("No value")
case .some(let value):
  print("Got a value: \(value)")
}

if let age = age {
    print("\(age)")//17

}

if (age != nil)  {
    print("\(age)")//Optional(17)

}

error
//Optional type 'Int?' cannot be used as a boolean; test for '!= nil' instead
if age {
    print("\(age)")

}

Key points

  • An enumeration is a list of related values that define a common type. 枚舉是定義公共類型的相關(guān)值的列表爹凹。

  • Enumerations provide an alternative to old-fashioned integer values.枚舉提供了一種替代老式整數(shù)值的方法

  • You can use enumerations to handle responses, store state and encapsulate values.您可以使用枚舉來處理響應(yīng)了罪,存儲(chǔ)狀態(tài)和封裝值。

  • Case-less enumerations prevent the creation of instances.枚舉里枚舉值為空不允許創(chuàng)建實(shí)例理逊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末橡伞,一起剝皮案震驚了整個(gè)濱河市盒揉,隨后出現(xiàn)的幾起案子晋被,更是在濱河造成了極大的恐慌兑徘,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件羡洛,死亡現(xiàn)場離奇詭異挂脑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)欲侮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門崭闲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人威蕉,你說我怎么就攤上這事刁俭。” “怎么了韧涨?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵牍戚,是天一觀的道長。 經(jīng)常有香客問我虑粥,道長如孝,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任娩贷,我火速辦了婚禮第晰,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘彬祖。我一直安慰自己茁瘦,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布储笑。 她就那樣靜靜地躺著甜熔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪南蓬。 梳的紋絲不亂的頭發(fā)上纺非,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音赘方,去河邊找鬼烧颖。 笑死,一個(gè)胖子當(dāng)著我的面吹牛窄陡,可吹牛的內(nèi)容都是我干的炕淮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼跳夭,長吁一口氣:“原來是場噩夢啊……” “哼涂圆!你這毒婦竟也來了们镜?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤润歉,失蹤者是張志新(化名)和其女友劉穎模狭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體踩衩,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嚼鹉,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驱富。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片锚赤。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖褐鸥,靈堂內(nèi)的尸體忽然破棺而出线脚,到底是詐尸還是另有隱情,我是刑警寧澤叫榕,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布浑侥,位于F島的核電站,受9級特大地震影響翠霍,放射性物質(zhì)發(fā)生泄漏锭吨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一寒匙、第九天 我趴在偏房一處隱蔽的房頂上張望零如。 院中可真熱鬧,春花似錦锄弱、人聲如沸考蕾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽肖卧。三九已至,卻和暖如春掸鹅,著一層夾襖步出監(jiān)牢的瞬間塞帐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工巍沙, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留葵姥,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓句携,卻偏偏與公主長得像榔幸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理削咆,服務(wù)發(fā)現(xiàn)牍疏,斷路器,智...
    卡卡羅2017閱讀 134,661評論 18 139
  • 今天晚上拨齐,小涵挨打了鳞陨。她爸一邊打,她一邊大聲哭鬧奏黑,和她爸對著干炊邦,一點(diǎn)沒有求饒的意思编矾。我在一邊默默看著熟史,不說話。從中...
    苫楓閱讀 260評論 0 0
  • 一窄俏、認(rèn)識(shí)JSONP 元素可以作為一種Ajax傳輸機(jī)制:只須設(shè)置 元素的src屬性(假如它還沒插入到document...
    _李雷閱讀 2,820評論 0 1
  • 昨夜的的這場秋雨跟靦腆的小姑娘似的蹂匹,一見到太陽就躲了,在地上沒有留下絲毫的印跡凹蜈。 伴隨著這場夜雨限寞,我貌似失眠了,家...
    lee小生閱讀 202評論 0 0
  • 我回來了仰坦÷闹玻回來和妳布置新房,回來和妳包裝喜糖悄晃,回來和妳整理賓客名單...... 送妳祝福玫霎,送妳擁抱,送妳出嫁妈橄。一路...
    高橋先生閱讀 190評論 0 0