Swift::8::枚举

本文深入探讨了Swift中枚举类型的定义、使用方法、原始值获取及转换,并通过实例展示了其在Switch语句中的应用。

#枚举 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 : LevelProgress
level2 = .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.Seventies
instantiatedDecade.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,这样处理更为安全。

本文参考:http://www.codingexplorer.com/enumerations-swift/

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值