[iOS] Xcode12 で SwiftGen を使う

SwiftGen とは

SwiftGenは、プロジェクトのリソース(画像、ローカライズされた文字列など)のSwiftコードを自動的に生成して、
タイプセーフに使用できるようにするツールです。

https://github.com/SwiftGen/SwiftGen#swiftgen

AssetCatalog などで作成した色などは通常文字列で指定しますが、その文字列たちをenumの値にマッピングしてくれるOSSです。
そうするとtypoがなくなり、またオートサジェストが効くようになるので、開発の規模が大きくなるほど効率が上がります。

LICENSE はこちらに記載されています。

検証のためのAssetCatalog を準備

Assets.xcassets

SampleBackgroundColor という名前で色の AssetCatalog を作成しました。
これから SwiftGen を使って、SampleBackgroundColor を Swift の定数として利用できるようにしていきます。

SwiftGen をインストール

https://github.com/SwiftGen/SwiftGen#installation に書いてある通りにすれば導入できます。
本稿ではCocoaPods でインストールしました。

設定ファイルを作成

https://github.com/SwiftGen/SwiftGen#configuration-file に書いてある通り、コマンドラインで下記を実行します。
すると、swiftgen.yml というファイルができます。

swiftgen config init

CocoaPods でインストールしたためswiftgen というコマンドがないよと言われました。
なので、下記ようにパス指定して swiftgen コマンドを打ちます。

<YourProjectDirectory>/Pods/SwiftGen/bin/swiftgen config init

設定ファイルを編集

作成された swiftgen.yml を編集していきます。
色のAssetCatalog で利用したいので、swiftgen.yml 中の以下の記述を編集していきます。

# xcassets:
#   inputs:
#     - Main.xcassets
#     - ProFeatures.xcassets
#   outputs:
#     - templateName: swift5
#       params:
#         forceProvidesNamespaces: true
#       output: XCAssets+Generated.swift

このように編集しました。

xcassets:
  inputs:
    - <PathToAssetFile>/Assets.xcassets
  outputs:
    - templateName: swift5
      params:
        forceProvidesNamespaces: true
      output: <PathToOutputDestinationDirectory>/XCAssets+Generated.swift

forceProvidesNamespaces: true について

少なくともこの例では書いても書かなくても特に動作が変わらないように見えました🤔

swiftgen.yml 中のコメントによると、これを設定しない場合
AssetCatalog のグループなどで Provides Namespace にチェックが入っているもののみが適応される、
とのことだったのですが。
Provides Namespace にチェックを入れなくても生成されていました🤔

Provides Namespace にチェックが入っていない

設定ファイルを元にSwiftで扱うコードを生成する

以下のコマンドを打ちます。

swiftgen

すると、先の設定ファイルに記述したファイル名でSwiftコードが生成されました。
以下抜粋。

internal enum Asset {
  internal enum Color {
    internal static let sampleBackgroundColor = ColorAsset(name: "SampleBackgroundColor")
  }
}

あとは生成したSwiftファイルをXcodeにインポートすれば、コードなどで使えます。

Xcode 内で使ってみる

インポートしたあと、以下のようにソースコード中で使えます。

let _: UIColor = Asset.Color.sampleBackgroundColor.color

ビルドする度にSwiftコードを生成する

これまでの手順で、手動でSwiftGen が走るようになりました。

でもAssetCatalog に追加する度に手動で swiftgen コマンドを走らせるのはスイッチングコストがかかります。

なので、ビルド時に都度設定を反映させます。
Build Phases から New Run Script Phase で以下のようなシェルを追加すればよいです。

$PODS_ROOT/SwiftGen/bin/swiftgen config run --config $SRCROOT/<YourPath>/swiftgen.yml
Build Phases から New Run Script Phase を追加する

最後に

以上です。お疲れ様でした!

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。