「R.swift」とは?
ストーリーボードや画像などのリソースを、簡単に取得できるようにするライブラリです。
導入することでAndroidと同様、「R.」でリソースを取得できるようになります。
https://developer.android.com/guide/topics/resources/accessing-resources.html?hl=JA
文章だけだと伝わりづらいので、導入前後のプログラムを紹介します。
// ストーリーボードからビューコントローラーを取得する
let view = UIStoryboard(name: "Main", bundle: Bundle.main)
.instantiateViewController(withIdentifier: "FooViewController")
as? FooViewController
// ストーリーボードからビューコントローラーを取得する
let view = R.storyboard.main.FooViewController()
見て分かる通り、簡潔にリソースを取得することができるようになります。
R.swift導入のメリット
プログラムが簡潔になる以外にも、以下のメリットがあります。
リソースをキャストせずに使える
例えばストーリーボードからビューコントローラーを取得する際、戻り値が対象のビューコントローラーの型になっているため、キャストせずにそのまま使えます。
実行時にアプリがクラッシュしない
ビルド時にリソース文字列をチェックするため、リソース文字列の指定ミスによって実行時にアプリがクラッシュすることがなくなります。
リソース名が自動補完される
リソースを文字列で指定せずにドットで取得できるため、画像やストーリーボードのリソース名を調べる手間が省けます。
環境
- Swift:5.0
- Xcode:10.2 (10E125)
- CocoaPods:1.7.0.rc.2
- R.swift:5.0.3
セットアップ方法
R.swiftのインストール
ここでは公式でおすすめされている通り、CocoaPodsからインストールする手順を紹介します。
ライブラリ管理ツールを使わずに手動でインストールする手順は公式ページをご参照ください。
https://github.com/mac-cain13/R.swift#manually
Podfileに以下を追加し、pod install
します。
+ pod 'R.swift'
※R.swiftはビルド時に使われるツールで、動的ライブラリではないため、 Carthageからはインストールできません 。
…と公式に記載されていますが、Homebrew + Carthageからインストールできるようです。
https://qiita.com/lovee/items/5617cdaa28a470b141c2
私はFirebaseやApp CenterのSDK導入でどのみちCocoaPodsを使っているので、公式のおすすめに従っています。
ビルド時にリソースファイルを生成するようにする
Xcodeでプロジェクトを開く
TARGETSで製品ターゲットを選択 > Build Phases > +をクリック > New Run Script Phase >
ドラッグ&ドロップで「[CP] Check Pods Manifest.lock」と「Compile Sources」の間に移動
展開して以下のスクリプトを記述します。
"$PODS_ROOT/R.swift/rswift" generate "$SRCROOT/R.generated.swift"
Input Files > +をクリック
以下を記述します。
$TEMP_DIR/rswift-lastrun
Output Files > +をクリック
以下を記述します。
$SRCROOT/R.generated.swift
⌘B でプロジェクトをビルドし、「$SRCROOT(通常はプロジェクトのルートフォルダ)」に「R.generated.swift」が生成されたら、プロジェクトにドラッグ&ドロップします。
[Copy items if needed]チェックをOFFにし、[Finish]をクリックします。
バージョン管理から無視する
不要な競合を防ぐため、生成された「R.generated.swift」をバージョン管理の対象外にします。
Gitを使っている場合、以下を「.gitignore」に追加するのみでOKです。
+ *.generated.swift
おわりに
これでR.swiftのセットアップは完了です!
ビルドするたびに「R.generated.swift」が更新され、リソースを「R.」で取得できるようになります。
公式の例などを参考に、R.swiftを使っていきましょう
https://github.com/mac-cain13/R.swift/blob/master/Documentation/Examples.md
私はまだストーリーボードからビューコントローラーを取得する際にしか使っていませんが、使えるところではどんどん使っていくつもりです。