前置き
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を生成するツールを作りました。
使い方
- 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ファイルを作る例です。
- 次のコマンドを実行します。
./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なりプルリクエストなり頂けると幸いです。