本文由海之号角(OceanHorn)翻译自 Enums With No Cases
今天早些时候我写了一篇的文章,文章是关于我为了使代码可读性更强而在 Swift 中使用 extension 的所有不常规的方式。这篇文章莫名其妙的在 Twitter 上引发了一场关于 Swift 命名规则的有趣的讨论。在这里我不会做详细的介绍,如果你感兴趣请点击这里。这里要说的是我学到了一些特别酷的东西:
第一条:你可以创建一个没有 case 的 enum 类型!
第二条:没有 case 的 enum 类型可以完美的应用在命名空间常量上!
我最喜欢的命名空间常量的例子来自@jesse_squires:
// Taken from http://www.jessesquires.com/swift-namespaced-constants/
struct ColorPalette {
static let Red = UIColor(red: 1.0, green: 0.1491, blue: 0.0, alpha: 1.0)
static let Green = UIColor(red: 0.0, green: 0.5628, blue: 0.3188, alpha: 1.0)
static let Blue = UIColor(red: 0.0, green: 0.3285, blue: 0.5749, alpha: 1.0)
struct Gray {
static let Light = UIColor(white: 0.8374, alpha: 1.0)
static let Medium = UIColor(white: 0.4756, alpha: 1.0)
static let Dark = UIColor(white: 0.2605, alpha: 1.0)
}
}
// Usage
let red = ColorPalette.Red
let darkGray = ColorPalette.Gray.Dark
但是这种方式的问题是其他开发者可能因为对 ColorPalette 不够了解而很容易像下面这样做了初始化。
let myColorPallete = ColorPalette()
然后就懵逼了……🤔
此时把 ColorPalette 的 Gray 从一个 struct 改成没有 case 的 enum 可以完美的解决问题!
// ColorPalette is now an enum with no cases!
enum ColorPalette {
static let Red = UIColor(red: 1.0, green: 0.1491, blue: 0.0, alpha: 1.0)
static let Green = UIColor(red: 0.0, green: 0.5628, blue: 0.3188, alpha: 1.0)
static let Blue = UIColor(red: 0.0, green: 0.3285, blue: 0.5749, alpha: 1.0)
// Gray is now an enum with no cases!
enum Gray {
static let Light = UIColor(white: 0.8374, alpha: 1.0)
static let Medium = UIColor(white: 0.4756, alpha: 1.0)
static let Dark = UIColor(white: 0.2605, alpha: 1.0)
}
}
// This still works as expected!
let red = ColorPalette.Red
let darkGray = ColorPalette.Gray.Dark
没有 case 的枚举不能初始化,因此当你尝试初始化一个 ColorPallete 枚举实例时会提示错误:
非常喜欢这种简单的小花招,感谢@jl_hfl!