iOS Development程序员iOS Developer

Swift enum和extension的小技巧

2016-03-18  本文已影响1049人  文兴

Swift语言里的enum是一个很方便的特性,用来枚举不同的状态。

举个例子,在上传文件过程中,可能会出现多种状态,比如成功,失败,取消等等,我们可以用一个enum来表示他们

enum UploadStatus{
    case Uploading
    case Waiting
    case Success
    case Error
    case Cancel
}

假如我需要对每一种状态,返回固定的中文显示的String,最笨的方法可能就类似下面

func getUploadStatusName(status:UploadStatus)-> String{
    switch status{
        case: .Uploading
            return "正在上传"
        case: . Waiting
            return "等待上传"
        case: . Success
            return "成功"
        case: . Error
            return "失败"
        case: . Cancel
            return "取消"
    }
}

当然这么笨的方法肯定太low啦,Swift原生就支持对enum指定一个类型

enum UploadStatus : String {
    case Uploading = "正在上传"
    case Waiting = "等待上传"
    case Success = "完成"
    case Error = "失败"
    case Cancel = "取消"
}

那我们使用的时候,就直接可以通过 status.rawValue取到上面的String
但是这种方法有一个局限性,就是只能对enum指定一个类型,例如如果我还想取到每个状态对应的字体的UIColor,那还是免不了一顿switch

当然,聪明的你可能会想到,定义一个struct/class作为enum的类型,然后在struct/class里面把所需要的固定值全都作为属性。然而当你尝试之后会发现,编译器提示rawValue must be literal,对enum指定的类型只能是字面量类型。关于字面量这里不展开叙述,放一个链接Swift字面量转换

到这里我们的extension就闪亮登场啦,我们可能常常会为一个classextension, 其实enum也可以做extension!我们可以为UploadStatus写一个extension

extension UploadStatus { // 状态对应颜色
    var textColor : UIColor {
        switch self {
        case .Error :
            return UIColor.redColor()
        case .Cancel :
            return UIColor.lightGrayColor()
        default:
            return UIColor(red: 11/255.0, green: 96/255.0, blue: 254/255.0, alpha: 1)
        }
    }
}

那我们要获取状态对应字体颜色的时候,只需要status.textColor就可以获取字体颜色啦!虽然这种方式也是需要 switch,但是比起最开始的写成一个方法,是不是逻辑上更加清晰,调用起来也更加简单呢?同样的,extension方式不会限制类型,所以如果你有其他的固定属性想通过枚举取到,你大可以为enum增加一个struct/class 类型的extension

extension还有许多很方便的用法,便于我们组织代码,这里就不展开叙述啦。这个小技巧就介绍到这里,希望大家喜欢!

上一篇下一篇

猜你喜欢

热点阅读