そーす

福岡在住のプログラマ。SwiftとかKotlinとかJavascriptとかSketchとか触ってます。

R.swiftでリソース関連のハードコーディングを無くす

f:id:saburesan:20160427075732p:plain

AndroidをやったあとにiOSをやると「ここ!使いにくいぃぃいい!!」って思う所が結構あります。

「画像、テキストなどのリソースアクセスがファイル名をハードコーディングする必要がある」

これです。 コンパイル時にエラーが検出できず、実際に実行して表示してみるしか確実な確認方法がありません。

Androidだとstrings.xmlとかdrawableフォルダに画像と突っ込むと

Stirng hello = getString(R.string.hello);
imageView.setImageResource(R.drawable.image);

とかいう感じでR.javaというリソース参照用のクラスが生成されるので非常に楽でした。

以前の投稿でこういうのを作りました。

saburesan.hatenablog.com

まぁ実用に至るレベルのものではなくAndroidっぽく参照できる機能が欲しいなと思って作ったのですが、

やはり同じような考えの人はいるようでR.swiftというライブラリが公開されています。 github.com

このライブラリではテキスト(Localizable.string)や画像(ImageAssets)にアクセスするための構造体が自動で生成され、その構造体のプロパティ/メソッド経由でリソースにアクセスできるので、コード補完もできますしタイポによるミスを防ぐことができます。

インストール

cocoapods経由が推奨されています

pod 'R.swift', '~> 2.2.2'

Xcodeの設定

ビルド時にR構造体を生成するスクリプトをフックさせます 1.YourProject.xcodeproj->Target->Build Phasesを開く

2.左上の「+」ボタンから「New Run Script Phase」を選択する f:id:saburesan:20160512004953p:plain

3.新しく出来た「Run Script」を「Check pods Manifest.lock」の下に移動する f:id:saburesan:20160512005203p:plain

4.「"$PODS_ROOT/R.swift/rswift" "$SRCROOT"」をscriptに追加 f:id:saburesan:20160826104918p:plain

5.ビルドするとR.generated.swiftがプロジェクトルートに作成されるのでプロジェクトに追加する。その際に「Copy items if needed」はチェックしない

6.gitignoreに*.generated.swiftを追加する

使い方

テキスト参照

let helloString: String = R.string.localizable.hello()

画像参照

let image: UIImage? = R.image.background

感想

こいつは素晴らしいぜ