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