swift简单总结(十八)—— 枚举

版本记录

版本号 时间
V1.0 2017.07.28

前言

  我是swift2.0的时候开始接触的,记得那时候还不是很稳定,公司的项目也都是用oc做的,并不对swift很重视,我自己学了一段时间,到现在swift3.0+已经出来了,自己平时也不写,忘记的也差不多了,正好项目这段时间已经上线了,不是很忙,我就可以每天总结一点了,希望对自己对大家有所帮助。在总结的时候我会对比oc进行说明,有代码的我会给出相关比对代码。
1. swift简单总结(一)—— 数据简单值和类型转换
2. swift简单总结(二)—— 简单值和控制流
3. swift简单总结(三)—— 循环控制和函数
4. swift简单总结(四)—— 函数和类
5. swift简单总结(五)—— 枚举和结构体
6. swift简单总结(六)—— 协议扩展与泛型
7. swift简单总结(七)—— 数据类型
8. swift简单总结(八)—— 别名、布尔值与元组
9. swift简单总结(九)—— 可选值和断言
10. swift简单总结(十)—— 运算符
11. swift简单总结(十一)—— 字符串和字符
12. swift简单总结(十二)—— 集合类型之数组
13. swift简单总结(十三)—— 集合类型之字典
14. swift简单总结(十四)—— 控制流
15. swift简单总结(十五)—— 控制转移语句
16. swift简单总结(十六)—— 函数
17. swift简单总结(十七)—— 闭包(Closures)

枚举

  不知道大家是否还记得在OC中枚举必须是整型,但是在swift中对这方面进行了优化,突破了这方面的限制。swift中不必给每一个枚举成员提供一个值,如果一个值被提供给每个枚举成员,则该值可以是一个字符串,一个字符,或者是一个整型值或者浮点值。

还要说明的是,在swift中枚举类型是一等类型(first - class),它们采用了很多传统上只被类(class)所支持的特征。比如:

  • 计算型属性(computed properties),用于提供关于枚举当前值的附加信息。
  • 实例方法(instance methods),用于提供和枚举所代表的值相关联的功能。
  • 枚举也可以定义构造函数(initializers)来提供一个初始成员值。
  • 可以在原始的实现基础上扩展它们的功能。
  • 可以遵守协议(protocols)来提供标准功能。

下面从以下四个方面进行讲解:

  • 枚举语法(Enumeration Syntax)
  • 匹配枚举值与switch语句(Matching Enumeration Values with a Switch Statement)
  • 相关值(Associated Values)
  • 原始值(Raw Values)

枚举语法

下面我们看一个例子。

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

这里要注意:OC中可以给第一个成员赋初始值,然后下面的成员就会顺着一次加1,但是swift中并不会这么做,这些枚举成员在ComposePoint的显示定义中拥有各自不同的值。

这些成员值还可以写在同一行上,用逗号隔开。

enum ComposePoint {
    case North, South, East, West
}

再次与OC相比,可见swift更加灵活多变,功能强大。

将枚举值赋值给变量或者常量时,可以按照下例进行。

class JJSwiftVC: UIViewController
{

    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        view.backgroundColor = UIColor.lightGray
        
        //枚举赋值情况
        var direction = ComposePoint.North
        direction = .West
        
    }
}

匹配枚举值与switch语句

枚举值可以和switch语句结合起来使用,看下面这个例子。

class JJSwiftVC: UIViewController
{

    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        view.backgroundColor = UIColor.lightGray
        
        //枚举赋值情况
        var direction = ComposePoint.North
        direction = .West
        
        switch direction {
        case .North:
            print("North")
        case .South:
            print("South")
        case .West:
            print("West")
        case .East:
            print("East")
        }
    }
}

下面看输出结果

West

相关值

如果有时候能够把其他类型的相关值和成员值一起存储起来会很有用,这能让你存储成员值之外的自定义信息,并且当你每次在代码中使用该成员时允许这个信息产生变化。swift的枚举可以存储任意类型的相关值,如果需要的话,每个成员的数据类型可以都是各不相同的,枚举的这种特性和其他语言中的辨识联合discriminated unions标签联合tagged unions变体variants类似。

看下面这个例子。

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

class JJSwiftVC: UIViewController
{

    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        view.backgroundColor = UIColor.lightGray
        
        var productBarCode = Barcode.UPCA(8, 85909_51226, 3)
        productBarCode = .QRCode("ABCDSFRGHJ")
        
        switch productBarCode {
        case .UPCA(let numberSystem, let identify, let check):
            print("UPC-A with value of \(numberSystem), \(identify), \(check)")
        case .QRCode(let productCode):
            print("QR code with value of \(productCode)")
        }
    }
}

下面看输出结果

QR code with value of ABCDSFRGHJ

如上,不同的条形码类型可以使用一个switch语句检查,然而这次相关值可以被提取坐位switch语句的一部分,你可以在switchcase分支代码中提取每个相关值作为一个常量或者作为一个变量来使用。

如果一个枚举成员的所有相关值被提去为常量,或者它们全部被提取为变量,为了简洁,你可以只放置一个var或者let标注在成员名称前。具体代码如下:

switch productBarCode {
case let .UPCA( numberSystem,  identify, check):
    print("UPC-A with value of \(numberSystem), \(identify), \(check)")
case let .QRCode( productCode):
    print("QR code with value of \(productCode)")
}

下面看输出结果

QR code with value of ABCDSFRGHJ

这里只是更改了代码组织结构,并没有改变最后的值,这里注意,只有同一个分支里面所有数据相关值类型一样时,数据类型才可以提到最前面。


原始值

在讲述相关值的时候,一个枚举成员可以存储不同类型的相关值,作为相关值的替代,枚举成员可以被默认值(称为原始值)预先填充,其中这些原始值具有相同的类型。

下面看个简单例子。

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

这里,ASCIICharacter的枚举的原始值类型被定义为Character
注意:原始值和相关值是不相同的,当你开始在你的代码中定义枚举的时候原始值是被预先填充的值,像上述三个ASCII值,对于一个特定的枚举成员,它的原始值始终是相同的,相关值是当你在创建一个基于枚举成员的新常量或者变量时才会被设置,并且每次当你这么做的时候,它的值可以是不同的。

原始值的类型可以是字符串,字符,或者任何整型值或浮点型值,每个原始值在它的枚举声明中必须是唯一的,当整型值被用于原始值,如果其他枚举成员没有值时,它们会自动递增,最后这一点和OC是一样的。

可以通过枚举成员的属性rawValue获取原始值。

下面看这个简单例子。

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

class JJSwiftVC: UIViewController
{

    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        view.backgroundColor = UIColor.lightGray
        
        let earthOrder = Planet.Earth.rawValue
        print(earthOrder)
    }
}

下面看输出结果

3

还可以通过参数为rawValue构造函数创建特定原始值的枚举,下面看这个例子。

class JJSwiftVC: UIViewController
{

    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        view.backgroundColor = UIColor.lightGray
        
        let possiblePlanet = Planet(rawValue: 7)
        print(possiblePlanet)
    }
}

下面看输出结果

Optional(JJSwift.Planet.Uranus)

大家可以看见,这个值的类型是可选的,也就是说这个值可能存在也可能不存在,下面我们看一下不存在的例子。

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

class JJSwiftVC: UIViewController
{

    override func viewDidLoad()
    {
        super.viewDidLoad()
        
        view.backgroundColor = UIColor.lightGray
        
        let possibleValue = 9
        if let somePlanet = Planet(rawValue: possibleValue) {
            switch somePlanet {
            case .Earth:
                print("Human Home")
            default:
                print("NO Humans")
            }
        }
        else {
            print("There is not a planet at position \(possibleValue)")
        }
    }
}

下面看输出结果

There is not a planet at position 9

后记

未完,待续~~~

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

推荐阅读更多精彩内容