はじめに
Carthage でライブラリを入れて開発をしているのですが、R.swift を初めて使う際に機能しなくて困っていました。
色々調べていく際に、M1Mac の「Homebrew の場所が Intel 製と異なる」という特徴が原因であると発覚したので、報告&改善策としてまとめます。
開発環境
- M1 macOS Monterey
- Swift5
- Xcode: 13.4.1
- R.swift: 6.1.0(13F100)
R.swiftとは
Swift プロジェクトで画像、フォント、ストーリーボードなどのリソースを簡単に取得できるようにするライブラリです。
これを導入するメリットは、以下の通りです。
- リソースをキャストせずに使える
- コンパイル時のチェックにより、誤った文字列でアプリがクラッシュしなくなる
- リソース名が自動補完される
具体的に 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")
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かコチラの記事をご参照ください。
手順は主に 3 つあります。
-
rswift
の自動生成プログラムをインストール - Carthage で R.swift ライブラリを導入
- Xcode へ移り、公式のGitHubのManuallyの2番以降の通りに設定をしていく
以下では、これらを順番に説明していきます。
rswift
の自動生成プログラムをインストール
Homebrew から rswift
の自動生成プログラムをインストールしてきます。
Brewfile を使用している方は brew "rswift"
の行を Brewfile に追加してください。
Homebrew を使用している方は、Terminal から brew install rswift
でインストールできます。
CarthageでR.swiftライブラリを導入
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番を参考に導入していきます。
Xcode にて、ファイルリストでプロジェクトをクリック。その後、"TARGETS"で "Build Phases"タブをクリックして、左上の+から、New Run Script Phaseを追加します。
次に、Run ScriptをCompile Sourcesの上にドラッグします。
そして、以下のスクリプトを貼り付けます。
if test -d /opt/homebrew/bin; then
export PATH=$PATH:/opt/homebrew/bin:/opt/homebrew/sbin
fi
rswift generate "$SRCROOT/R.generated.swift"
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
を参照するように、以下のコードを最初の行に追加する必要があります。
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のチェックを外します。
↑のような形になっていればビルド毎に R.swift を実行できます。
まとめ
M1 Mac で R.swift を利用する際は、Run Scriptに homebrew の場所を参照するよう追加のコードを記述する必要がある。
今回は Carthage を用いた R.swift の導入でした。
しかし、R.swift 自体は Carthage での導入を推奨しておらず、Cocoa Pods での導入を推奨しているため、CocoaPods で開発ができるのであれば、そちらをオススメします。
参考文献
おまけ:セットアップ方法
R.swift で文字列を使用する方法をここで解説します。
プロジェクトディレクトリの配下に .strings
拡張子のファイルを配置します。Xcode では、右クリック→New file...
から追加できます。
デフォルトの AppDelegate.swift
の同層配下であればディレクトリがネストしていても取得可能です。
"one" = "hoge";
"helloSwift" = "Hello Swift!";
一度、command+B
でビルドした後、これをプロジェクト内で使うと以下のようになります。
let hogeText = R.string.messages.one() // hoge
let helloText = R.string.messages.helloSwift() // Hello Swift!
となります。