R.swift を Embedded Framework で利用する方法
はじめに
R.swift は文字列や画像などのリソースを管理できる非常に便利なライブラリですが、Embedded Framework から利用しようとすると少しだけ工夫が必要です。
自分は若干 Embedded Framework で R.swift を利用する時に詰まってしまったので、記事として残そうと思いました。
今回の記事では R.swift の基本的な利用方法は理解していることを前提としています。(README の Installation が理解できていれば十分だと思います)
R.generated.swift
を生成する
Embedded Framework 用の README の Installation を参考にして R.swift を利用すれば R.generated.swift
が生成されるはずです。
単一の Target であればこの利用方法で困ることはありませんが、例えば Embedded Framework ごとに Installation に記載された方法でそのまま生成しようとすると複数の Build Phase で R.generated.swift
という同じ名前のファイルを生成しようとしているというエラーが発生してしまいます。
そのため、私は以下のようにしてその問題を回避しました。
- Podfile に Embedded Framework 用の R.swift の記述を追加
- Embedded Framework の Target の Build Phase に R.swift 用のスクリプト等を追加
- 生成された
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
以下に生成されるはずです
R.generated*.swift
を Embedded Framework の Target に追加
3. 生成された 最後に生成された 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