SwiftGenの使い方を調べた

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

環境

  • Xcode 9.2
  • SwiftGen 5.3.0

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 を使う予定

Sourceryの使い方を調べた

Sourceryの使い方を調べたので記録を残しておく

Sourceryとは

Sourcery は Swift のボイラープレートを自動生成するためのツール try! Swift Tokyo 2018における作者のトーク によると Sourcery は 5000 以上の実プロジェクトで使われていて、 Apple 社員のなかにもユーザがいるとのこと。

モチベーション

Swift は厳格な静的型付言語であるがゆえ、大量のボイラープレートが必要になる。例えばオブジェクト同士を比較するためのEquatableも開発者が実装する必要がある。1つのクラスであれば大した作業ではないが、クラス数が増えることで大変な手間となり、バグが混入する原因にもなる。それらを自動化するためのツールが Sourcery である。

利点として導入にリスクがなく、不要になったらテンプレートを削除すればOKであること、タイプセーフであることが挙げられる。

導入方法

Sourcery のリポジトリにあるサンプルプロジェクト を参考にするとよい。

1. ディレクトリ作成

以下のディレクトリをあらかじめ作成しておく

2. Cocoapods

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

Podfileの内容は以下のとおり

target 'YoutTargetName' do
  use_frameworks!
  pod 'Sourcery'

end

3. Run Script の設定

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

各引数に

を指定する

"${PODS_ROOT}/Sourcery/bin/sourcery" --sources "${SRCROOT}/YourProjectName" --templates "${SRCROOT}/Templates" --output "${SRCROOT}/CodeGenerated"

もちろんBuild Phrasesにこのスクリプトを追加せず、手動で実行する運用でも問題ない。

4. プロトコルの実装

AutoEquatable, AutoHashableなど自動生成するプロトコルを予めどこかに実装する。これをやっておかないとツールがエラーになり、生成に失敗する。

protocol AutoEquatable {}

5. ビルド

1 ~ 4 までの手順が完了すれば、ビルドする度にSourceryによるコード生成が行われる。

Templatesの書き方

テンプレートは Stencil という Django template, Mustache に似た記法を使って書く。

リポジトリ にサンプルがあるのでこの辺りから出発するのが良さそう。

try! Swift Tokyo 2018にいってきた

今年もtry! Swiftに参加してきた。昨年に続きとても楽しい時間を過ごすことができた。運営の方々に感謝。

今年はSwiftの言語仕様、OSS、コミュニティ、エコシステム、マルチプラットフォームといった話題についてより深い内容を扱っているトークが多かった。iOSアプリ開発の文脈でのトークは昨年に比べて少なかった。

個人的に面白かった発表

言語プロセッサに精通することは、作業効率化ツールを作ることができたり、たくさん実利があると感じた。最近LLVMコンパイラについて調べたりしているので、そのあたりの自分の興味ともマッチして、とても面白かった。

今 In Review とのことだが、iOS版のCharlesが出るそう。会場もかなり沸いていた。

所感

  • 今年は言語自体に関する話が多かった印象

    • Swiftの言語仕様
    • SIL, ASTなどSwift言語、LLVMフロントエンドに関する発表
    • マルチプラットフォーム, Linux
    • ASTを用いたツール開発による効率化
    • iOSDCとの棲み分けができていて良い (向こうはアプリ設計、デザイン、運用の話が中心)
  • 国際カンファレンス

    • 海外からの参加者と気軽にコミュニケーションできるのが良い
    • 海外からの参加者への配慮が行き届いていると感じた
    • Slack
    • 翻訳レシーバ
    • 場内の英語表示

beta配信したアプリをインストールできない時のチェックリスト

仕事でよくCrashlytics betaを使ってアプリの配布を依頼されるのだが、インストールできないと問い合わせを受けることがある。 その時にチェックする項目を備忘のためリストにしておく。

  • UDIDは登録済みか
  • Provisioning Profileは更新したか
  • ビルドには更新したProvisioning Profileを使ったか
  • Crashlyticsにメールアドレスは登録済みか
  • Crashlyticsからの再配信は試したか
  • 端末にbeta配信したアプリと同じbundle idを使っているアプリが入っていないか

それでも駄目なら

  • 端末からプロファイルを削除して登録からやり直す
  • ipaファイルを直接インストールする

GNU開発ツールを読んだ

正月休みにGNU開発ツールを読んだ。とても良い本だった。

C言語で書かれたHello Worldのプログラムをビルドして実行する時に、裏で行われていることについて書かれている。最初にgccドライバが何をしているか大まかな流れを説明し、その後プリプロセス、コンパイルアセンブル、リンクの各工程を解説するという構成で大変分かりやすかった。また文章も平易で理解しやすかった。細かいコマンドの全てに詳しい説明が書いてあり、実際にコマンドをUbuntu上で実行しながら読んだ。

以前、理論寄りのコンパイラの本を何冊か読んでみたことがあったが、自分には敷居が高かった。この本はコンパイラ初学者の入門に最適だと感じた。

絶版で、現在は著者のページで電子ファイルのみ購入することができる。 www.oversea-pub.com

React Nativeの環境構築をした

React Nativeの勉強に少し手をつけたので、環境構築の記録を残しておく。

マシンはmacOS 10.12.6

入れたもの

VSCodeを使いたかったので以下も入れた。

Xcode

iOSネイティブアプリの開発環境。App Storeからインストールする。

Android Studio

Androidネイティブアプリの開発環境。以下のリンクからインストールする。

developer.android.com

homebrew

nodeのインストールに必要。

brew.sh

node

$ brew install node

watchman

ファイルの変更を検知して、シミュレータの内容を即座に更新するために使用する

$ brew install watchman

github.com

react-native-cli

React Nativeのコマンドラインツール

$ npm install -g react-native-cli

Visual Studio Code

以下のリンクからインストールする。

Visual Studio Code - Visual Studio

VSCode extension for react native

Visual Studio CodeにはReact Native用の拡張機能が存在する。Visual Studio Codeを起動して、画面左下のアイコンから拡張機能に移動し React Native と検索するとヒットする。

参考

以下のコースを参考にしている。

https://www.udemy.com/the-complete-react-native-and-redux-course

2017年のふりかえり

アウトプット

登壇

同僚の誘いでGitLab Meetup Tokyo #2で登壇した。初めての勉強会での登壇だったが、良い経験になった。アウトプットへの心理的障壁が下がった。

OSSへのコントリビュート

3 pull requests, 2 merged

年末にふと思い立って出したプルリクエストが立て続けにマージされた。壊れたExampleプロジェクトのビルドを直したりWarningを解消するような簡単な修正ではあったが、普段自分が使っているライブラリにコントリビュートすることができた。

blog

アウトプットを増やしたいと思い、今月になって意識的に投稿するようになった。Qiitaにも申し訳程度に投稿した。

インプット

読書

ここ数年継続的に行なっている。 booklogによると 47冊読了していた。ただそのうち技術書は僅か8冊だった。思っていた以上に少ない。今年は本を読み終えることよりも、読書を通して知りたい内容を引き出すことを意識していたにしても。あと8月に10冊読んだのは有休消化中で暇だったから。

Android

Androidの勉強を始めた。

仕事

転職

8月で前職を退職。9月から現職に転職した。

前職

風通しがよく、気持ちよく仕事ができる人が多かった。色々な場面で親身に話を聞いてくれた上司と同僚にはとても感謝している。印象に残っている仕事として、昨年末から関わっていたプロジェクトを3月に無事リリースできた。

現職

大分慣れてきた。まだ大きなアウトプットを出せていないので、来年はもっと貢献したいと思っている。

来年

アウトプットを増やす。特にOSSへのコントリビュートは続けていきたい。インプットは領域を狭めて、深く学べるようにする。