R.swiftのセットアップ方法(Swift5)

## 「R.swift」とは？

ストーリーボードや画像などのリソースを、簡単に取得できるようにするライブラリです。

導入することでAndroidと同様、「R.」でリソースを取得できるようになります。
https://developer.android.com/guide/topics/resources/accessing-resources.html?hl=JA

文章だけだと伝わりづらいので、導入前後のプログラムを紹介します。

```swift:R.swift導入前
// ストーリーボードからビューコントローラーを取得する
let view = UIStoryboard(name: "Main", bundle: Bundle.main)
    .instantiateViewController(withIdentifier: "FooViewController")
    as? FooViewController
```

```swift:R.swift導入後
// ストーリーボードからビューコントローラーを取得する
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` します。

```diff:Podfile
+ 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」の間に移動__

<img width="1010" alt="スクリーンショット_2019-06-02_10_52_09.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/9bf70546-0ddb-1ce3-9e7c-563c3893d96f.jpeg">


展開して以下のスクリプトを記述します。

```
"$PODS_ROOT/R.swift/rswift" generate "$SRCROOT/R.generated.swift"
```

__Input Files > +をクリック__
以下を記述します。

```shell-session
$TEMP_DIR/rswift-lastrun
```

__Output Files > +をクリック__
以下を記述します。

```shell-session
$SRCROOT/R.generated.swift
```

<img width="845" alt="スクリーンショット_2019-06-02_10_58_41.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/5486846e-bc7a-adbf-bbc6-f2b0352ebb90.jpeg">

<kbd>⌘B</kbd> でプロジェクトをビルドし、「$SRCROOT(通常はプロジェクトのルートフォルダ)」に「R.generated.swift」が生成されたら、プロジェクトにドラッグ&ドロップします。
<img width="275" alt="スクリーンショット_2019-06-02_11_23_49.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/23ed1ea2-afba-3fbb-eb95-9f34ecb79638.jpeg">

[Copy items if needed]チェックをOFFにし、[Finish]をクリックします。
<img width="738" alt="スクリーンショット_2019-06-02_11_06_21.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/138245/7c44306b-9472-8e96-114f-456f2c180848.jpeg">

### バージョン管理から無視する

不要な競合を防ぐため、生成された「R.generated.swift」をバージョン管理の対象外にします。

Gitを使っている場合、以下を「.gitignore」に追加するのみでOKです。

```diff:.gitignore
+ *.generated.swift
```

## おわりに

これでR.swiftのセットアップは完了です！
ビルドするたびに「R.generated.swift」が更新され、リソースを「R.」で取得できるようになります。

公式の例などを参考に、R.swiftを使っていきましょう:relaxed:
https://github.com/mac-cain13/R.swift/blob/master/Documentation/Examples.md

私はまだストーリーボードからビューコントローラーを取得する際にしか使っていませんが、使えるところではどんどん使っていくつもりです。

## 参考リンク

- [mac-cain13/R.swift: Get strong typed, autocompleted resources like images, fonts and segues in Swift projects](https://github.com/mac-cain13/R.swift)
- [【Swift】R.swiftが優秀すぎるので紹介してみる ｜ DevelopersIO](https://dev.classmethod.jp/smartphone/iphone/r-swift-introduction/)