iOS

SwiftGenを使ってみた

投稿日:2019年9月17日 更新日:

はじめに

こんにちは。カイザーです。Swiftでのコードジェネレータでは、SwiftGenやRSwiftが有名ですね。
今回は、SwiftGenを紹介します。

SwiftGenとは、stringsやStoryboard、Asset Catalog等のリソースから、Swiftファイルをジェネレートする、CLIツールです。
iOSでのリソース使用にありがちな、文字列での名前指定では無く、ジェネレートされた定数定義や構造体を使用することにより、typoを無くすことができます。

今回は、簡単なスライドショーアプリをサンプルに、SwiftGenを使っていきたいと思います。

SwiftGenの特徴

先に、SwiftGenの特徴を説明しておきましょう。

コードジェネレートするリソースを選択することができる

様々なリソースの中から、必要な種類、ファイル、ディレクトリなどに絞り込む設定が可能です。
そのため、コードジェネレートに余計な時間はかかりません。
(R.swiftでは対応するすべてのリソースが自動的に含まれます。)

コードジェネレートするのにビルドが必要ない

自前でリソースファイルをパースし、コードジェネレートします。そのため、ビルドは発生しません。

設定ファイルベースである

swiftgen.yml ファイルをプロジェクトファイルと同じ階層に配置し、設定を記載することができます。
この設定ファイルさえGitで共有すれば、誰でも同じルールでコードがジェネレートされます。

インストール

Cocoapods, Homebrew, Mintからインストール可能ですが、今回はCocoapodsを使用します。プロジェクトごとに、SwiftGenのバージョンを管理したいためです。

Podfileに pod 'SwiftGen' を追記し、 $ pod install すれば、インストール完了です。
利用するには、プロジェクトルートまで移動し、 $ Pods/SwiftGen/bin/swiftgen で実行可能です。

Localizable.strings

多言語アプリでは必須のファイルですね。

swiftgen.ymlでの設定

以下の設定を行います。

なお swiftgen-ex はサンプルプロジェクト名なので、皆さんのプロジェクト名に読み替えてください。

strings

1番初めの strings はリソースの種類を表します。SwiftGenが対応しているもののみ、指定可能です。

inputs

inputs は、リソースファイルそのものを示します。ファイル単体を指定することもできますし、ディレクトリを指定することもできます。
指定は単数でも、複数でも可能です。
ディレクトリの場合、その中の全てのファイルが対象となりますが、別途 filter を設定することで、正規表現でファイル名を指定することもできます。(Interface Builderで説明します)

outputs

outputs はコードジェネレータの出力方法や、出力先を設定します。

テンプレート

SwiftGenでは「テンプレート」によって、ジェネレートされたSwiftコードの構造が決まります。それを指定するのが templateName です。
stringsでは、 structured-swift4flat-swift4 が使用可能です。

structured-swift4

stringsファイルで、キーをドット区切りにすると、その指定に沿って構造化された定数がジェネレートされます。(実際はenumです)
例えば、以下のようなstringsファイルを作ると

Swift側からは、以下のように呼び出せます。

さらに、 L10n でピンと来たかもしれませんが、この呼び出しにより Localizable.strings での多言語も反映されます。

flat-swift4

今回は使用しませんが、 structured-swift4 とは対象的に、構造的にならず、フラットな構造でコードジェネレートされます。

output

ジェネレートされたSwiftファイルの出力先です。今回は Generated ディレクトリ配下にします。
このディレクトリ配下は、コンフリクト防止のため、gitignoreしておくと良いでしょう。

コードジェネレート

リソースファイルの準備と、 swiftgen.yml の編集が完了したら、プロジェクトルートで $ Pods/SwiftGen/bin/swiftgen を実行します。
すると、outputで指定したディレクトリにSwiftファイルが出てきます。
これらをプロジェクトに追加し、使用します。

Interface Builder

Storyboardには様々な「Identifier」という設定項目があり、全て文字列のため、誰しも間違えたことはあるでしょう。SwiftGenではStoryboardとSegueを定数化することができます。

swiftgen.ymlでの設定

以下を追記します。

1番初めは ib となります。

inputs/filter

filter では、 inputs のディレクトリの内容を、正規表現で絞り込むことができます。今回は、拡張子がstoryboardのものを絞り込んでいます。

outputs

今回は outputs が2つあります。 scenes-swift4 はStoryboardや画面、 segues-swift4 はSegueを定数化します。

コードジェネレート

Storyboard

StoryboardのViewControllerなどをインスタンス化するには、以下のようにします

Storyboardのファイル名や、Identifierを文字列として渡す必要が無いので、すっきりとしています。

Segue

コードからSegueで画面遷移するときに、とても便利です。

値を渡すときは、これまで通り prepare(for segue:) を実装しますが、Segueの判定にSwiftGenが使えます。

このコードは、サンプルアプリで写真がタップされたときに、写真画面に遷移する内容です。
残念な点が1つだけあり、destinationのキャストが従来通り発生してしまうことです。ここは、R.Swiftの方が、一枚上手かなと思います。

Asset Catalog

最近のXcodeでは、 #imageLeteral などを使用することによって簡単にAsset Catalogにアクセスできるようになりましたが、SwiftGenでもAsset Catalogの定数化が可能なので、紹介します。
普段のIDEにAppCodeを使用している場合は重宝します。

swiftgen.ymlの設定

以下を追記します。

1番初めは xcassets となります。AssetCatalogの設定はシンプルですね。ちなみに、複数のAssetCatalogを使用している場合は、 inputs に書き足したり、複数のAssetCatalogが入っているディレクトリごとまとめて指定してしまっても構いません。

コードジェネレート

今回は、 Assets.xcassets 直下に、”london”, “paris”, “italy” の3つの画像を配置しました。そのため、それぞれの呼び出しは以下となります。

これで、UIImageを取得することができます。

その他のリソース

ここで紹介した以外にも、様々なリソースに対応しています。以下にそれぞれのジェネレート仕様が記載されています。
https://github.com/SwiftGen/SwiftGen/tree/master/Documentation/SwiftGenKit%20Contexts

また、出力テンプレート仕様については、以下に記載されています。
https://github.com/SwiftGen/SwiftGen/tree/master/Documentation/templates

さいごに

今回は、SwiftGenを試しましたが、同種であるR.Swiftも調べながら調査しました。どちらにも、長所短所があるため、R.Swiftとの比較記事も書いてみたいと思います!

おすすめ書籍

[改訂新版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 WEB+DB PRESS plus 詳解 Swift 第4版 [改訂新版]Swiftポケットリファレンス (POCKET REFERENCE)

blog-page_footer_336




blog-page_footer_336




-iOS
-

執筆者:

免責事項

このブログは、記事上部に記載のある投稿日時点の一般的な情報を提供するものであり、投資等の勧誘・法的・税務上の助言を提供するものではありません。仮想通貨の投資・損益計算は複雑であり、個々の取引状況や法律の変更によって異なる可能性があります。ブログに記載された情報は参考程度のものであり、特定の状況に基づいた行動の決定には専門家の助言を求めることをお勧めします。当ブログの情報に基づいた行動に関連して生じた損失やリスクについて、筆者は責任を負いかねます。最新の法律や税務情報を確認し、必要に応じて専門家に相談することをお勧めします。


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA


関連記事

【Swift】URLスキームのアプリ間連携について

1 はじめに2 アプリ間連携とは2.1 URLスキーム2.2 App Groups3 URLスキームの実装方法について3.1 URLスキームの設定3.2 カスタムURLスキームの設定4 URLスキーム ...

swift

[Swift]UIViewからUIImageを作成しローカルに保存

1 はじめに1.1 前提条件2 実装2.1 UIViewからUIImageへ2.2 UIImageをローカルに保存2.3 おまけ:画像のリサイズ3 さいごに4 おすすめ書籍 はじめに こんにちは、nu ...

iOSでFABを表現する「material-components」「Floaty」

1 はじめに2 Floating Action Button(FAB)とは3 Material Components3.1 導入方法3.2 FABの配置3.3 FABをタップした時の処理4 Float ...

[Swift4]StringのSwft4変更点と文字列操作

1 はじめに2 Swift4でのString変更点2.1 コレクション化2.2 文字列長の取得2.3 文字列を複数行で定義3 文字列操作3.1 英大文字、小文字変換3.2 ひらがな、カタカナ変換3.3 ...

Xcode11のデバッグ機能

1 はじめに2 Device Conditions2.1 Thermal state condition2.2 Network link condition3 Environment Override ...

フォロー

blog-page_side_responsive

2019年9月
1234567
891011121314
15161718192021
22232425262728
2930  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。