給 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,然後在 String的 extension添加 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)
觀察上面的調用, Wizzard, Message, Tutorial分別對應一個 enum。你可以在 UIStoryboard中添加多個 enum,然後為每個分配一個 case入口。
總結
作者最後很貼心地寫了一個庫 “SwiftGen”,為你自動產生這個 enum,你只要在工程中匯入就好了。