#枚举 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,这样处理更为安全。
本文参考: