LoginSignup
2
1

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

Last updated at Posted at 2022-08-30

はじめに

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

開発環境

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

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")
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コチラの記事をご参照ください。

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

  1. rswift の自動生成プログラムをインストール
  2. Carthage で R.swift ライブラリを導入
  3. Xcode へ移り、公式のGitHubのManuallyの2番以降の通りに設定をしていく

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

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番を参考に導入していきます。

Xcode にて、ファイルリストでプロジェクトをクリック。その後、"TARGETS"で "Build Phases"タブをクリックして、左上の+から、New Run Script Phaseを追加します。

次に、Run ScriptCompile Sourcesの上にドラッグします。

そして、以下のスクリプトを貼り付けます。

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"

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 の同層配下であればディレクトリがネストしていても取得可能です。

message.strings
"one" = "hoge";
"helloSwift" = "Hello Swift!";

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

let hogeText = R.string.messages.one()  // hoge
let helloText = R.string.messages.helloSwift() // Hello Swift!

となります。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1