Swift enum和extension的小技巧

作者: 文兴 | 来源:发表于2016-03-18 17:00 被阅读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还有许多很方便的用法,便于我们组织代码,这里就不展开叙述啦。这个小技巧就介绍到这里,希望大家喜欢!

    相关文章

      网友评论

        本文标题:Swift enum和extension的小技巧

        本文链接:https://www.haomeiwen.com/subject/ttfhlttx.html