枚舉作為常量使用的一個小技巧

來源:互聯網
上載者:User
給 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,你只要在工程中匯入就好了。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.