23
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

SwiftUIAdvent Calendar 2022

Day 13

R.Swiftのプラグインの導入方法(Xcode project編)

Last updated at Posted at 2022-12-12

2022/11/29に R.Swift 7.0.0 がリリースされ、Swift Package Manager ビルドツールプラグインの機能が追加されました。この R.Swift プラグインの導入方法についてREADMEに沿って説明します。

インフォメーション
記事執筆現在、既に 7.2.4 がリリースされており、引き続き頻繁なリリースが続きそうな勢いです。
導入される方は最新のリリースを導入すると良いと思います :ok_woman:

R.Swiftのプラグインとは

R.Swiftにはこれまでプラグインの機能はありませんでした。今回の7.0.0で新規に追加されたものです。
この機能により、R.generated.swiftが自動生成されます。

なお、そもそもプラグインとは何かを知りたい方は、以下の記事を読まれることをおすすめします :pray: :sparkles:

R.Swiftのプラグインの導入方法

R.Swiftのプラグインの導入方法は、2種類あります。

  • Xcode project
    • Xcode project の "Package Dependencies" から R.Swift を追加する方法
  • Package.swift
    • Package.swift に記述する方法

当記事では、Xcode project で導入する方法を説明します。

README.md をみると以下のように丁寧に説明されています。
結論から言えば、この通りにやればもう完璧なのですが、私は最後かなり戸惑ったのでその実体験をもとに、スクショと共に一緒に見ていきたいと思います :muscle:

Xcode project - SPM

  1. In Project Settings, on the tab "Package Dependencies", click "+" and add github.com/mac-cain13/R.swift
  2. Select your target, on the tab "General", in the section "Frameworks, Libraries, and Embeded Content", click "+" and add RswiftLibrary
  3. Select your target, on the tab "Build Phases", in the section "Run Build Tool Plug-ins", click "+" and add RswiftGenerateInternalResources
  4. Right-click on your project, click RswiftModifyXcodePackages, click Run, click Allow Command to Change Files
  5. Build your project, now the R struct should be available in your code, use auto-complete to explore all static references

1. In Project Settings, on the tab "Package Dependencies", click "+" and add github.com/mac-cain13/R.swift

SwiftPMを使っている方にはおなじみのとこです。

プロジェクト設定の "Package Dependencies" タブを開き、"+" ボタンをクリックします。
1-1.png

右上の検索バーに github.com/mac-cain13/R.swift を入力し、R.Swiftを検索します。
"Dependency Rule" を適宜変更してください(画像の場合は、 Up to Next Major Version で、7.0.0以上を指定しています)。
1-2.png

"Package Product" で選択候補が2つ出ますが、 RswiftLibrary のみチェックを入れます。

戸惑った点
コマンドラインツールの rswift はチェックしなくてもOKでした。

1-3.png

パッケージ追加後の様子
1-4.png

2. Select your target, on the tab "General", in the section "Frameworks, Libraries, and Embeded Content", click "+" and add RswiftLibrary

ターゲット設定を選択し、"General" タブを開き、"Frameworks, Libraries, and Embeded Content" のセクションで、 "+" をクリックします。
2-1.png

検索バーに RswiftLibrary を入力し、表示されている RswiftLibraryを選択して、追加ボタンをクリックします。
2-2.png

RswiftLibrary 追加後の様子
2-3.png

3. Select your target, on the tab "Build Phases", in the section "Run Build Tool Plug-ins", click "+" and add RswiftGenerateInternalResources

ターゲット設定を選択し、"Build Phases" タブの "Run Build Tool Plug-ins" セクションで、"+" をクリックします。
3-1.png

検索バーに RswiftGenerateInternalResources を入力し、表示されている RswiftGenerateInternalResourcesを選択して、追加ボタンをクリックします。
3-2.png

ビルドツールプラグイン追加後の様子
3-3.png

4. Right-click on your project, click RswiftModifyXcodePackages, click Run, click Allow Command to Change Files

プロジェクト上で右クリックし、RswiftModifyXcodePackagesをクリックします。
4-1.png

Run をクリックします。
4-2.png

その後ダイアログが出てきたら、 Allow Command to Change Files をクリックします。

5. Build your project, now the R struct should be available in your code, use auto-complete to explore all static references

プロジェクトをビルドします。

...これで R 構造体がコードで利用可能になりました!
え?とここで戸惑った点は以下の通りです。

戸惑った点
R.generated.swift ファイルを、手動で生成する必要はありません。

戸惑った点
import Rswift を書く必要はありません。

R 構造体の使用方法

Swiftファイルで、 R. と入力すると、オートコンプリートですべての静的リファレンスを検索できます。

この項では、以下の使用例を記述します。

対象 事前準備
文字列 Localizable.strings を追加し、文字列を追加しておく "greeting" = "Hello, world!"; という文字列を追加
画像 Assets に Image Set を追加しておく icon という名前の Image Set を追加 画像
Assets に Color Set を追加しておく primary という名前の Color Set を追加 色

R 構造体の使用例

  • コード例
import SwiftUI
// `import Rswift` は書きません。

struct SampleView: View {
    var body: some View {
        VStack {
            Text(R.string.localizable.greeting())  // 文字列
                .font(.largeTitle)
                .foregroundColor(Color(R.color.primary))  // 色

            Image(R.image.icon)  // 画像
                .resizable()
                .aspectRatio(contentMode: .fit)
                .frame(width: 200)
        }
    }
}

struct SampleView_Previews: PreviewProvider {
    static var previews: some View {
        SampleView()
    }
}

  • プレビュー
プレビュー

R.xxx を省略して書きたい場合

まず、従来の R.Swift では、以下のように Typealias を使うことで、R.xxx を省略して書くことができました。

typealias L10n = R.string.localizable
typealias Image = R.image
typealias Color = R.color

R.Swift 7.x 以降では、 R_R 構造体のインスタンスになったことにより、以下のように変数として定義することで、同様の機能を果たすことができます。

let l10n = R.string.localizable
let image = R.image
let color = R.color

インフォメーション
・省略形の変数名は、私は上記のように定義してみましたが、この辺りはお好みで。
・なお L10n とは、localization の lとn の間に10文字あることからついた名称です。類似ライブラリの SwiftGen では、 L10n という表記が採用されているので、真似してみました。

R.xxx を省略して書いた場合の使用例

  • コード例
import SwiftUI
// `import Rswift` は書きません。

struct SampleView: View {
    var body: some View {
        VStack {
            Text(l10n.greeting())  // 省略形を使った文字列
                .font(.largeTitle)
                .foregroundColor(Color(color.primary))  // 省略形を使った色

            Image(image.icon)  // 省略形を使った画像
                .resizable()
                .aspectRatio(contentMode: .fit)
                .frame(width: 200)
        }
    }
}

struct SampleView_Previews: PreviewProvider {
    static var previews: some View {
        SampleView()
    }
}

よりすっきりしました。

R.generated.swift の所在

R.generated.swift ファイルを、手動で生成する必要はありません。

と記載しましたが、それではこのファイルは一体どこにあるのでしょうか?
R の定義に飛ぶと、確かにこのファイルは存在しています。

まず、右側カラムの "Show the File inspector" を確認したところ、"Not Applicable" (該当なし)でした。
次に、左側カラムの検索バーで、ファイル名や _R などを検索ワードにして探しましたが、ヒットしませんでした。
プロジェクトファイル内にない :thinking: ...??ということで、以下の方法でやっとファイルの所在がわかりました。

画像のように、Xcode の R.generated.swift 内で、右クリックしポップアップメニューを表示し、 Navigate > Show in Finder をクリックします。

探し方

Finder が開きました。階層が深いです。

Finder

パスを確認したところ以下のようなパスでした。
アプリに内包されているのではなく、ユーザーディレクトリの Library/Developer/Xcode/DerivedData/ の中に生成されていることがわかりました。

/Users/{ユーザー名}/Library/Developer/Xcode/DerivedData/{アプリ名}-hawjwftgyaobilfxndsomwxfakir/SourcePackages/plugins/{アプリ名}.output/{アプリ名}/RswiftGenerateInternalResources/{アプリ名}/Resources/R.generated.swift

R.generated.swift ファイルを手動で生成する方法

なお、R.generated.swift ファイルを手動で生成することもできます。
ただし、ツールによる自動生成ファイルはGit管理に入れるべきではない、各自で管理すべき、という考え方があるので、私は今のところ用途は思いついてません。

プロジェクト上で右クリックし、 RswiftGenerateResourcesCommand をクリックします。

RswiftGenerateResourcesCommand

Run をクリックします。

RswiftGenerateResourcesCommand

Finder を開くと、プロジェクトの最上位階層に R.generated.swift ファイルが生成されているのが確認できます。

RswiftGenerateResourcesCommand

最後に

以上、R.Swiftのプラグインの導入方法の説明でした。
ご覧いただきありがとうございます。

参考リンク

23
8
1

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
23
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?