转载

枚举作为常量使用的一个小技巧

给 Swift.GG 翻译文章的时候,顺着文中的链接又学习了两篇,现在翻译这么多篇也算有点心得了,也总结了一整套还算完备的理论,以后会找时间专门说说。

这篇 很简单,大概记录下,就不逐句翻译了

众所周知,Swift 中的枚举类型比 OC 强大多了。今天介绍一种拿枚举当做常量使用的小技巧。

为你的 Image Assets 添加枚举

以前创建图片都用 UIImage(named: "FooBar") 这种方式,你需要记住一系列的 "foobar" , "FooBar" , "foo_bar" , "foo-bar" 图片名称,还要小心不要拼错了,毕竟没有自动补全。

当然你也可以定义一个常量 let FooBarImageName = "FooBar" 避免拼写错误,但定义一个全局常量不酷啊,就算把他们都组织在一个全局范围的静态结构体中也不那么优雅。

接下来看看用 Swift 的 enum 如何解决(enum 可以带一个 原始类型字符串

enum ImageAsset : String {     GreenApple = "green-apple"   Banana = "banana"   Pear = "pear"   Strawberry = "1-strawberry"   Strawberries = "strawberry-basket" } 

添加构造器

既然我们需要 image ,就添加一个计算属性

extension ImageAsset {     var image : UIImage {     return UIImage(named: self.rawValue)!   } } 

现在调用 ImageAsset.GreenApple.image 就能得到一个 UIImage ,不会拼错,提供自动补全。

既然是创建图片,那我们连 UIImage 也一同改造了吧,加个构造器

extension UIImage {     convenience init(asset: ImageAsset) {     self.init(named: asset.rawValue)!   } } 

现在可以通过 UIImage(asset: .GreenApple) 获得图片了

为你的 UIColors 添加枚举

UIColors 的本质其实可以表示 RGBA 的十六进制数( ffcc00ff ),所以我们用 UInt32 的枚举类型来表示颜色:

extension UIColor {     enum ColorName : UInt32 {     case Translucent = 0xffffffcc     case ArticleBody = 0x339666ff     case Cyan = 0xff66ccff     case ArticleTitle = 0x33fe66ff   } } 

现在可以用上面的枚举构建 UIColor 实例了,添加一个初始化,做点位运算:

extension UIColor {     convenience init(named name: ColorName) {     let rgbaValue = name.rawValue     let red   = CGFloat((rgbaValue >> 24) & 0xff) / 255.0     let green = CGFloat((rgbaValue >> 16) & 0xff) / 255.0     let blue  = CGFloat((rgbaValue >>  8) & 0xff) / 255.0     let alpha = CGFloat((rgbaValue      ) & 0xff) / 255.0      self.init(red: red, green: green, blue: blue, alpha: alpha)   } }  UIColor(named: .ArticleBody)   

无处不在地用 enum 常量

请跟我念 enum 大法好!

Localizable.strings

创建一个 enum ,然后在 Stringextension 添加 convenience init ,然后你就可以用 String(key: .Greetings) 代替 NSLocalizedString("Greetings", comment: "") 了。

UIStoryboard

有时你需要创建 UIStoryboard 实例以及 UIViewControllers ,为了避免使用全局常量(storyboardIDs/identifiers),可以用 enum 的方式解决,改造之后的调用非常优雅:

let wizzardVC = UIStoryboard.Wizzard.initialViewController()   let msgCompVC = UIStoryboard.Message.Composer.viewController()   let tutorialVC = UIStoryboard.Tutorial.viewController(.QuickStart)   

观察上面的调用, WizzardMessageTutorial 分别对应一个 enum 。你可以在 UIStoryboard 中添加多个 enum ,然后为每个分配一个 case 入口。

总结

作者最后很贴心地写了一个库 “SwiftGen” ,为你自动生成这个 enum ,你只要在工程中导入就好了。

原文  http://chengway.in/mei-ju-zuo-wei-chang-liang-shi-yong/
正文到此结束
Loading...