美文网首页
Swift: 😎,没有case的枚举

Swift: 😎,没有case的枚举

作者: 海之号角 | 来源:发表于2016-07-13 11:53 被阅读27次

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

    相关文章

      网友评论

          本文标题:Swift: 😎,没有case的枚举

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