[M1Mac]Carthageを用いてR.swiftを使う方法

# はじめに
Carthage でライブラリを入れて開発をしているのですが、R.swift を初めて使う際に機能しなくて困っていました。
色々調べていく際に、M1Mac の「Homebrew の場所が Intel 製と異なる」という特徴が原因であると発覚したので、報告＆改善策としてまとめます。

# 開発環境

- M1 macOS Monterey
- Swift5
- Xcode: 13.4.1
- R.swift: 6.1.0(13F100)

# R.swiftとは
Swift プロジェクトで画像、フォント、ストーリーボードなどのリソースを簡単に取得できるようにするライブラリです。

https://github.com/mac-cain13/R.swift

これを導入するメリットは、以下の通りです。

- リソースをキャストせずに使える
- コンパイル時のチェックにより、誤った文字列でアプリがクラッシュしなくなる
- リソース名が自動補完される

具体的に Swift コードで見てみる。

```swift:R.swiftなし
let icon = UIImage(named: "settings-icon")
let font = UIFont(name: "San Francisco", size: 42)
let color = UIColor(named: "indicator highlight")
let viewController = CustomViewController(nibName: "CustomView", bundle: nil)
let string = String(format: NSLocalizedString("welcome.withName", comment: ""), locale: NSLocale.current, "Arthur Dent")
```
```swift:R.swiftあり
let icon = R.image.settingsIcon()
let font = R.font.sanFrancisco(size: 42)
let color = R.color.indicatorHighlight()
let viewController = CustomViewController(nib: R.nib.customView)
let string = R.string.localizable.welcomeWithName("Arthur Dent")
```
のように R．swift で記述した方が、簡潔にリソースを取得できます。

# R.swiftの導入方法
ここから本題で、Carthage を利用して R.swift を導入していきます。
Carthage のインストール方法に関しては、[CarthageのGitHub](https://github.com/Carthage/Carthage#installing-carthage)か[コチラの記事](https://qiita.com/KaitoMuraoka/items/4904f67c58d93c677667#homebrew%E3%82%92%E5%88%A9%E7%94%A8%E3%81%97%E3%81%9F%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB)をご参照ください。

手順は主に 3 つあります。

1. `rswift` の自動生成プログラムをインストール
1. Carthage で R.swift ライブラリを導入
1. Xcode へ移り、[公式のGitHubのManuallyの2番](https://github.com/mac-cain13/R.swift#manually)以降の通りに設定をしていく

以下では、これらを順番に説明していきます。

## `rswift` の自動生成プログラムをインストール
Homebrew から `rswift` の自動生成プログラムをインストールしてきます。
Brewfile を使用している方は `brew "rswift"` の行を Brewfile に追加してください。
Homebrew を使用している方は、Terminal から `brew install rswift` でインストールできます。

## CarthageでR.swiftライブラリを導入
Cartfile に以下のコードを追加して下さい。
```:Cartfile
github "mac-cain13/R.swift.Library"
```
その後、ターミナルで `carthage update --use-xcframeworks　--platform iOS` を実行します。（開発が iOS であると仮定して、`--platform iOS` にしました。）すると、`.xcframework` を作成できます。
そして、Xcode 内の General から"Frameworks, Libraries, and Embedded Content"セクションに、`.xcframework` を追加します。
これで、Carthage で R．swift ライブラリを導入できました。
しかし、このままでは R.swift 本来の力を発揮できないので、R．swift の設定をしていきます。

## 公式のGitHubのManuallyの2番以降の通りに設定をしていく
ここからは、[公式のGitHubのManuallyの2番](https://github.com/mac-cain13/R.swift#manually)を参考に導入していきます。

Xcode にて、ファイルリストでプロジェクトをクリック。その後、"TARGETS"で　"Build Phases"タブをクリックして、左上の＋から、**New Run Script Phase**を追加します。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/707293/de4bda33-2877-1b06-0935-c104dcd846fe.png" width=75%>
次に、**Run Script**を**Compile Sources**の上にドラッグします。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/707293/e1f52cdb-d123-4317-11e2-4e88066e5dbf.png" width=75%>

そして、以下のスクリプトを貼り付けます。
```swift:Run Script
if test -d /opt/homebrew/bin; then
    export PATH=$PATH:/opt/homebrew/bin:/opt/homebrew/sbin
fi
rswift generate "$SRCROOT/R.generated.swift"
```
:::note warn
Point!
GitHub 上では、`"$SRCROOT/rswift" generate "$SRCROOT/R.generated.swift"` だけなのに、なぜ↑のような書き方をするのか？
:::
`"$SRCROOT/rswift"` ではなく、`rswift` である理由は、先ほどすでに Homebrew で `rswift` を導入しているからです。そのため、`"$SRCROOT/rswift"` で呼び出さなくても `rswift` で呼ぶ出すことが可能です。
また、M1 Mac は Homebrew を `/opt/homebrew` で保存しています。
一方、Intel Mac は `/usr/local` に保存されています。
現在の Xcode13 は、Run Script を実行した際に `/usr/local` を参照してしまいます。
そのため、`/opt/homebrew` を参照するように、以下のコードを最初の行に追加する必要があります。
```swift
if test -d /opt/homebrew/bin; then
    export PATH=$PATH:/opt/homebrew/bin:/opt/homebrew/sbin
fi
```

最後に、Build Phase の**Output Files**に、`$SRCROOT/R.generated.swift` を追加して下さい。
その後、**Based on dependency analysis**のチェックを外します。

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/707293/f7968832-7874-8065-6f49-cf78afc27e75.png" width=50%%>

↑のような形になっていればビルド毎に R.swift を実行できます。

# まとめ
M1 Mac で R.swift を利用する際は、**Run Script**に homebrew の場所を参照するよう追加のコードを記述する必要がある。
今回は Carthage を用いた R.swift の導入でした。
しかし、R.swift 自体は Carthage での導入を推奨しておらず、Cocoa Pods での導入を推奨しているため、CocoaPods で開発ができるのであれば、そちらをオススメします。

# 参考文献
https://qiita.com/uhooi/items/82fbdd94bdc467a22422

https://qiita.com/lovee/items/5617cdaa28a470b141c2

# おまけ：セットアップ方法
R.swift で文字列を使用する方法をここで解説します。

プロジェクトディレクトリの配下に `.strings` 拡張子のファイルを配置します。Xcode では、右クリック→`New file...` から追加できます。

デフォルトの `AppDelegate.swift` の同層配下であればディレクトリがネストしていても取得可能です。
```:message.strings
"one" = "hoge";
"helloSwift" = "Hello Swift!";
```

一度、`command+B` でビルドした後、これをプロジェクト内で使うと以下のようになります。

```swift
let hogeText = R.string.messages.one()  // hoge
let helloText = R.string.messages.helloSwift() // Hello Swift!
```
となります。