🐽

R.swift を Embedded Framework で利用する方法

2021/02/25に公開

はじめに

R.swift は文字列や画像などのリソースを管理できる非常に便利なライブラリですが、Embedded Framework から利用しようとすると少しだけ工夫が必要です。
自分は若干 Embedded Framework で R.swift を利用する時に詰まってしまったので、記事として残そうと思いました。
今回の記事では R.swift の基本的な利用方法は理解していることを前提としています。(README の Installation が理解できていれば十分だと思います)

Embedded Framework 用の R.generated.swift を生成する

README の Installation を参考にして R.swift を利用すれば R.generated.swift が生成されるはずです。
単一の Target であればこの利用方法で困ることはありませんが、例えば Embedded Framework ごとに Installation に記載された方法でそのまま生成しようとすると複数の Build Phase で R.generated.swift という同じ名前のファイルを生成しようとしているというエラーが発生してしまいます。
そのため、私は以下のようにしてその問題を回避しました。

  1. Podfile に Embedded Framework 用の R.swift の記述を追加
  2. Embedded Framework の Target の Build Phase に R.swift 用のスクリプト等を追加
  3. 生成された R.generated.swift を Embedded Framework の Target に追加

1. Podfile に Embedded Framework 用の R.swift の記述を追加

まずは Podfile に Embedded Framework 用の R.swift の記述を追加します

target 'ExampleEmbeddedFramework' do
  use_frameworks!

  pod 'R.swift'
end

プロジェクトのディレクトリ配下で pod install を実行すれば Embedded Framework 用の CocoaPods の依存関係が整理されます

2. Embedded Framework の Target の Build Phase に R.swift 用のスクリプト等を追加

次に Embedded Framework の Build Phase に R.swift 用のスクリプトを追加します

Build Phase の「Compile Sources より上」かつ「'Check Pods Manifest.lock` より下」に Script を適当な名前で作成します

script には以下のようなものを入力します

"$PODS_ROOT/R.swift/rswift" generate --accessLevel public "$SRCROOT/R.generated-{Embedded Framework の名前など}.swift"

--accessLevel public が重要で、これを指定することによって public 修飾子で変数・メソッドなどが公開された状態の R.generated*.swift が生成されます

また Input Files には 以下を追加し、

$TEMP_DIR/rswift_lastrun

Output Files には以下を追加します

$SRCROOT/R.generated-{Embedded Framework の名前など}.swif

上記までで指定している $SRCROOT/R.generated-{Embedded Framework の名前など}.swift については、好きなファイル名、ディレクトリを指定して大丈夫です

ここまで設定して一度プロジェクトをビルドすると R.generated-{Embedded Framework の名前など}.swift$SRCROOT 以下に生成されるはずです

3. 生成された R.generated*.swift を Embedded Framework の Target に追加

最後に生成された R.generated*.swift を Embedded Framework のディレクトリに Xcode 上から追加します
その際は Copy items if needed のチェックを外すようにしましょう

ここまでで既に Embedded Framework 用の R.generated*.swift は利用できるようになっているので、あとはメインの Target などで Embedded Framework を import し、{Embedded Framework の名前}.R.* のような形で R.swift の記法が利用できるようになっているかと思います

おわりに

理解してみれば普通に R.swift を利用する方法と大した差はないのですが、忘れると詰まりそうなので残しておきました。
自分も探り探りでこの方法を見つけはしたのですが、もっと良い方法を知っている方がいれば教えて頂けると嬉しいです。

参考

Discussion