Swift.GG の記事を翻訳していたとき、記事内のリンクをたどり、さらに 2 つの記事を勉強しました。今では、非常に多くの記事を翻訳した経験があり、比較的要約することもできました。理論の完全なセットについては、将来的に時間を見つけて具体的に説明します。
この記事は非常に簡単なので、一文ずつ翻訳するつもりはありません。
ご存知のとおり、Swift の列挙型は OC よりもはるかに強力です。今日は列挙型を定数として使用するためのちょっとしたテクニックを紹介します。
以前は、UIImage(名前: "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"}
画像が必要な場合は、計算された属性を追加します
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 の本質は、実際には RGBA 16 進数 (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 大法を唱えるのは良いことです!
列挙型を作成し、String 拡張子にコンビニエンス init を追加します。その後、NSLocalizedString("Greetings" の代わりに String(key: .Greetings) を使用できます。コメント: " ")。
グローバル定数 (storyboardID/識別子) の使用を避けるために、変換後の呼び出しで、UIStoryboard インスタンスと UIViewController を作成する必要がある場合があります。
let wizzardVC = UIStoryboard.Wizzard.initialViewController() let msgCompVC = UIStoryboard.Message.Composer.viewController() let tutorialVC = UIStoryboard.Tutorial.viewController(.QuickStart)
上記の呼び出しは、Wizzard、Message、Tutorial がそれぞれ列挙型に対応していることに注目してください。複数の列挙型を UIStoryboard に追加し、それぞれにケース エントリを割り当てることができます。
作者は最終的に、この列挙型を自動的に生成するライブラリ「SwiftGen」を作成しました。これをプロジェクトにインポートするだけです。