LoginSignup
20
21

More than 5 years have passed since last update.

SwiftでAsset CatalogをType Safeに使う補助ツールを作りました

Posted at

前置き

WWDC'15の Swift in Practice にて、Type SafeにAsset Catalogの画像を使う方法が紹介されており、これは是非実践したいな〜と。
具体的には、SwiftでUIImageを使う際にモヤっとする下記の内容を解決する方法です。

  • Asset CatalogのID文字列をアプリ固有のEnum型にマッピング
  • non-failableなイニシャライザ(UIImage(imageNamed:)はfailableですよね)
UIImageExtension
extension UIImage {
    enum AssetIdentifier: String {
        case Isabella = "Isabella"
        case William  = "William"
        case Olivia   = "Olivia"
    }

    convenience init!(assetIdentifier: AssetIdentifier) {
        self.init(named: assetIdentifier.rawValue)
 }
}
利用例
let olivia = UIImage(assetIdentifier: .Olivia)

上記のようにAsset CatalogのIDをEnum型にマッピングするのは素晴らしいです。
しかし、Asset Catalogに画像が追加される度に手作業でEnumの値を更新するのは、人為的ミスが発生しやすく苦行になりかねません。

作ったツール

そこでAsset Catalogから上記のようなEnum, イニシャライザが実装されたUIImageのextensionを生成するツールを作りました。

Misen
https://github.com/tasanobu/Misen

使い方

  • 1. ファイルのパーミッションを変更

chmod +x misen.swift

  • 2. misen.swiftを実行
    • path : Asset Catalogのパス
    • exportPath : 出力するUIImage extensionファイルのパス(ファイル名込み)
./misen.swift -path PATH -exportPath OUTPUT_FILE_PATH

利用例

下記のAsset CatalogからUIImage extensionファイルを作る例です。

asset-catalog.png

  • 次のコマンドを実行します。
./misen.swift -path ./Misen.xcassets -exportPath ./UIImageExtension.swift
  • コマンド実行後、指定したパスに下記のようなファイルが生成されます。
UIImageExtension.swift
extension UIImage {

    convenience init!(assetName: AssetName) {
        self.init(named: assetName.rawValue)
    }

    enum AssetName: String {
        case Camera = "Camera"
        case Home = "Home"
        case Mail = "Mail"
    }
}
  • コード上での使い方は非常に簡単です。
let camera = UIImage(assetName: .Camera)
let home   = UIImage(assetName: .Home)
let mail   = UIImage(assetName: .Mail)

まとめ

もしよろしければ是非お使い下さい。
ご意見、ご要望などあれば、可能な限り対応しようと考えておりますので、Issueなりプルリクエストなり頂けると幸いです。

Misen
https://github.com/tasanobu/Misen

20
21
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
20
21