Swift3.0枚举(Enumerations)

枚举是啥我就不多说了。
Swift中的枚举更灵活,并且不必给每个枚举成员赋值。如果给枚举成员赋值(称为『原始』值),这个值可以是字符串、字符、整型或者浮点型。

此外,枚举成员可以指定任意类型的关联值存储到枚举成员中,就像其他语言中的联合体(unions)和变体(variants)。每一个枚举成员都可以有适当类型的关联值。

在 Swift 中,枚举类型是一等(first-class)类型。它们采用了很多在传统上只被类(class)所支持的特性,例如计算型属性(computed properties),用于提供枚举值的附加信息,实例方法(instance methods),用于提供和枚举值相关联的功能。枚举也可以定义构造函数(initializers)来提供一个初始值;可以在原始实现的基础上扩展它们的功能;还可以遵守协议(protocols)来提供标准的功能。

原谅上面这两段话,我是copy的。。

枚举语法(Enumeration Syntax)

先来个简单的枚举:

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

注意
与C和OC不同,Swift的枚举在创建的时候是不会赋一个默认的整型值的。相反,在上面的例子中,枚举的每个成员的值就他们本身,并且类型就是 CompassPoint 类型。

多个成员出现在一行的时候,用逗号隔开:

enum Planet {
    case mercury, venus, earth, mars, jupiter, saturn, uranus, neptune
}

每个枚举都是一个新的类型,所以和Swift中的其他类型一样,首字母大写。并且最好用单数名字而不是复数名字:

var directionToHead = CompassPoint.north

上面🌰中,directionToHead被推断为CompassPoint类型,所以当你在改变值的时候可以使用更简短的点语法:

directionToHead = .south

用Swift语句匹配枚举值(Matching Enumeration Values with a Switch Statement)

Matching Enumeration Values with a Switch Statement🌰

关联值(Associated Values)

在Swift的枚举中,可以给每个枚举成员设置关联值,各个成员之间的关联值的类型可以不相同,并且在使用的时候可以修改关联值。枚举的这种特性跟其他语言中的可识别联合(discriminated unions),标签联合(tagged unions),或者变体(variants)相似。

举个🌰,现在有一个厂商,它有两种条形码。一种是UPC-A格式的一维码,是由四个部分组成的:『数字系统』(1位)、『厂商代码』(5位)、『产品代码』(5位)、『检查位』(1位):


一维码

另一种就是 QR 码格式的二维码,可以存储最多 2953个字符的字符串:


二维码

所以这个枚举就可以这么定义:

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

这样定义了之后不会赋任何值,只是声明了类型。但是当Barcode
常量和变量等于 Barcode.UPCA 或 Barcode.QRCode 时,可以存储的关联值的类型:

var productBarcode = Barcode.upc(8, 85909, 51226, 3)
productBarcode = .qrcode("ABCDEFGHIJKLMNOP")

这样的情况下,productBarcode的值就会被后面的这个替换掉。


🌰

如果每个关联值都被提取成常亮(变量),为了简洁,只需要在成员名称前面标注 let(var) 就可以了:


还是那个🌰

原始值(Raw Values)

上面的🌰讲了一下怎么关联不同的值,接下来要说的就是怎么设置默认值(原始值),但是设置原始值,每个成员的类型必须一致:

enum ASCIIControlCharacter: Character {
    case tab = "\t"
    case lineFeed = "\n"
    case carriageReturn = "\r"
}

原始值可以是字符串、字符,也可以是任意值的整型或浮点型,但是每个成员的值必须是唯一的!

注意
原始值和关联值是不同的。原始值就是枚举定义时预先填充的值,而关联值是一个基于枚举类型的常量(变量)才设置的值。最显著的区别就是原始值设置之后就不会改变了,但是关联值是会在之后的调用中改变的。

原始值的隐式赋值(Implicitly Assigned Raw Values)
当设置用字符串和整型设置原始值的时候,不必给每一个成员都设置一遍,Swift会自动设置。

举个🌰,当设置整型的时候,隐式赋值的值会一次增加1,如果第一个枚举成员没有设置原始值,其原始值为0:

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

当设置的是字符串的时候,隐式赋值就是没给成员的名字:


总结一下

用原始值初始化枚举实例(Initializing from a Raw Value)

文字没整理好怎么翻译,直接上🌰:


🌰

这个🌰中不是所有的rawValue都可以找到一个对应的枚举成员,也就是说用这种方法创建的枚举实例返回的类型是一个可选类型。再通俗点就是这么初始化实例有可能返回nil:


不一样的🌰

递归枚举(Recursive Enumerations)

递归枚举也是枚举的一个类型,它是由一个或者多个枚举成员使用该枚举类型的实例作为关联值。在枚举成员前加上 indirect 关键字来表示该成员可递归,同时告诉编译器插入一个间接层(layer of indirection):


举个小🌰

也可以在枚举前面加上 indirect 来表明所有的成员都是可以递归的:


🌰

下面的🌰展示了使用ArithmeticExpression这个递归枚举计算表达式(5 + 4) * 2:


怎么感觉这个🌰让我写有点困难呢
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • 本章将会介绍 闭包表达式尾随闭包值捕获闭包是引用类型逃逸闭包自动闭包枚举语法使用Switch语句匹配枚举值关联值原...
    寒桥阅读 1,550评论 0 3
  • 枚举为一组相关的值定义了一个共同的类型,使得可以在代码中以类型安全的方式来使用这些值。 如果熟悉 C 语言,会知道...
    穷人家的孩纸阅读 851评论 1 4
  • 枚举为一组相关的值定义了一个共同的类型,使你可以在你的代码中以类型安全的方式来使用这些值。 如果你熟悉 C 语言,...
    雨影阅读 340评论 0 0
  • 那拉提草原是新疆最著名的草原之一,也是世界四大草原之一的亚高山草甸植物区,其位于那拉提山北坡,是发育在第三纪古洪积...
    心安处即归途阅读 357评论 0 0
  • 很喜欢纪伯伦的这首诗,父母在对待亲子关系上的准则: “你的儿女,其实不是你的儿女。 他们是生命对于自身渴望而诞生的...
    心行者阅读 192评论 0 1