iOS
Swift

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

More than 1 year has passed since last update.

前置き

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