Swift: 😎,没有case的枚举

本文由海之号角(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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容