SwiftGenの使い方を調べた

仕事で新しいプロジェクトに導入したく、 SwiftGen の使い方を調べていた

SwiftGen とは

https://github.com/SwiftGen/SwiftGen

プロジェクトのリソース用のSwiftコードを自動的に生成し、タイプセーフな使用を可能にするCLIツール 具体的には以下の5つに対応している

  • Asset Catalogs
  • Color
  • Font
  • Storyboard およびそのシーン
  • Localizable.strings

モチベーション

iOS開発では、前述のようなリソースにアクセスするには文字列を使う必要があるが、それらをタイプセーフにすることで人的なエラーを排除することが目的

導入方法

1. ディレクトリ作成

生成されたコードを格納するディレクトリを作成する

2. Cocoapods

iOSアプリで使用する場合、 Cocoapodsを使ってインストールが可能。

Podfileの内容は以下のとおり

target 'YoutTargetName' do
  use_frameworks!
  pod 'SwiftGen'

end

3. swiftgen.yml

プロジェクトルートに swiftgen.yml を作成する 一例として、以下のように書ける

strings:
  paths: Resources/Base.lproj/Localizable.strings # パスを指定する
  templateName: structured-swift4 # Swift 4 を使用
  output: CodeGenerated/strings.swift # どこに生成したファイルを格納するか
xcassets:
  paths:
   - path/to/Assets.xcassets
  templateName: swift4
  output: CodeGenerated/assets-images.swift
storyboards:
  paths:
   - path/to/Storyboards
  templateName: swift4
  output: CodeGenerated/storyboards.swift
colors:
  paths:
   - path/to/colors.json
  templateName: swift4
  output: CodeGenerated/colors.swift

4. スクリプトの実行

Run Scriptを設定するやり方と、コマンドラインで実行するやり方の2種類が考えられる

Run Script の設定

TARGETS -> プロジェクト名 -> Build Phrases -> New Run Script Phrase を追加して、以下のスクリプトを実行するように設定する

"${PODS_ROOT}/SwiftGen/bin/SwiftGen"

コマンドライン

プロジェクトルートで

$ Pods/SwiftGen/bin/SwiftGen

を実行する

SwiftGen と R.swift の比較

SwiftGen に近いツールでよく知られたものに R.swift がある

機能面はほぼ同等で、以下のような違いがある

SwiftGen R.swift
導入 やや面倒 簡単
制御 不要な機能は disable できる 全部入り
ビルド クラスがリソースごとに分かれているため、毎回全ビルドが走ることはない リソースファイルに増減がある度に R.generated.swift の全ビルドが走るので、大規模プロジェクトでは時間がかかる

好みの範疇と言えそうだが、 SwiftGen の方が取り回しが良さそうなので、 SwiftGen を使う予定