博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Swift::8::枚举
阅读量:7095 次
发布时间:2019-06-28

本文共 1892 字,大约阅读时间需要 6 分钟。

  hot3.png

#枚举 Swift 的枚举类型功能强大,跟类(class),结构体(struct)比起,有过之而不及。下面一起来看看它的庐山真面目。

定义

定义时使用关键字 eumn, 而且可以像switch那样使用case,像这样:

enum LevelProgress{    case Completed    case attemptedButIncomplete    case unattempted}

枚举类型,还可以进行类型绑定,修改一下上面的例子:

enum LevelProgress{    case Completed(Int)    case AttemptedButIncomplete(Double, NSDate)    case Unattempted}

这时,就可以这个使用枚举了:

var level1 = LevelProgress.Completed(3)

如果变量定义时,初始化后通过推出得到是某枚举类型,就可以忽略枚举类型的名字,而直接使用:

var level1 = LevelProgress.Completed(3)level1 = .AttemptedButIncomplete(0.75, testDate)

再比如:

var level2 : LevelProgresslevel2 = .Completed(3)

如果枚举作为函数参数,同样可以在调用时进行简单书写,如:

func printLevelDetails(level: LevelProgress)printLevelDetails( .Completed(3) )

使用

枚举最常用于Switch,比如:

func printLevelDetails(level: LevelProgress){    switch level    {        case .Unattempted:            println("Didn't attempt")        case .AttemptedButIncomplete(let percentComplete, let lastAttemptedDate):            println("About \(percentComplete) complete, last tried \(lastAttemptedDate).")        case .Completed(let stars):            println("Complete with \(stars) stars.")    }}

原始值

在使用C语言枚举类型时,如果你想获得枚举之原始值,即整数,需要进行类型转换,而Swift则提供更简便的方法。

用原始值定义枚举

这个比较简单,类似C语言,例如:

enum FirstYearOfDecade: Int{    case Seventies = 1970    case Eighties  = 1980    case Nineties  = 1990}

获取原始值

使用toRaw() 方法即可,上例就可以这么处理:

FirstYearOfDecade.Eighties.toRaw() let instantiatedDecade = FirstYearOfDecade.SeventiesinstantiatedDecade.toRaw()

这时,instantiatedDecade.toRaw() 返回的是一个整型 1970。那么如果想通过原始值获得对应的枚举值,要怎么做的呢?Swift 提供了fromRaw方法。

if let otherDecade = FirstYearOfDecade.fromRaw(1990){    switch otherDecade    {    case .Nineties:        println("I love the 90s")    default:        println("What decade are you talking about?")    }}else{    println("Couldn't find it")}

不过,大家注意到没有,fromRaw返回的是可选型的值。为什么呢?原因是你可能提供了一个并没有对应枚举型的原始值,需要返回nil,这样处理更为安全。

本文参考:

转载于:https://my.oschina.net/suda/blog/340824

你可能感兴趣的文章
8.1.3 链路状态数据库
查看>>
I/O重定向和管道——《Unix/Linux编程实践教程》读书笔记(第10章)
查看>>
华章1-2月份新书简介(2018年)
查看>>
PreparedStatement的用法
查看>>
For多重循环 break continue
查看>>
BaseRecyclerViewAdapterHelper开源项目之点击事件源码学习
查看>>
JAVA解析JSON大全
查看>>
Java基础学习总结(23)——GUI编程
查看>>
让App的运行速度与响应速度趋于一流(iOS)
查看>>
大型网站技术架构(八)网站的安全架构
查看>>
Java基础学习总结(16)——Java制作证书的工具keytool用法总结
查看>>
学习Redis必须了解的N个常识
查看>>
源码配置svn+apache
查看>>
找出数组中唯一重复的数
查看>>
JAVA中sleep()、wait()、yield()、join()方法浅析
查看>>
Linux安裝卡巴斯基
查看>>
Spring(一)——总体介绍
查看>>
搭建简单的DHCP服务 (照着敲就能搭建好)
查看>>
select count(*)和select count(1)的区别
查看>>
Spring AOP实现对redis统一管理 (注解方式)
查看>>