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就闪亮登场啦,我们可能常常会为一个class做extension, 其实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还有许多很方便的用法,便于我们组织代码,这里就不展开叙述啦。这个小技巧就介绍到这里,希望大家喜欢!