Objective-CからSwift化したクラスをstoryboard/xibで使っている時に、コマンドラインで一括でModule設定を付ける

Thursday, April 21, 2016

最近、会社で開発しているプロジェクトで、Objective-Cで書いたコードをSwift化しているのですが、
UIButtonやUILabelのサブクラスをObjective-C→Swiftに書き換えた時に、

Storyboard/xib も修正しないといけなくなりました。

原因

どうやら、Swift化したことで、Storyboard/xibにカスタムクラスを設定した時に設定される__Module__という部分が設定されずに、
load時にクラスを読み込めずにクラッシュしたりしてしまうようです。
image
そう、 こやつ です。 storyboardを開いて、再度クラス名を入力することでcurrent - プロジェクト名とModuleが入るのですが、
これを1つずつポチポチやるのは 非常に面倒 です。特に大きいプロジェクトだと使ってる場所が多かったり…
なので、これをコマンドラインでサクッとやってのけます。

コマンドラインで置換する

※Git等で前の状態にresetできるようにはしておきましょう。

以下のコマンドを叩くことで、プロジェクト内一括で指定したカスタムクラスを持つstoryboard/xibを修正することができます。


$ git grep -l 'customClass="クラス名">' | xargs sed -i '' -e 's/customClass="クラス名">/customClass="クラス名" customModule="Famm" customModuleProvider="target">/g'

# 複数行で見やすくするとこんな感じです
$ git grep -l 'customClass="クラス名">' \
| xargs sed -i '' -e \
's/customClass="クラス名">/customClass="クラス名" customModule="Famm" customModuleProvider="target">/g'

クラス名、プロジェクト名は、それぞれ入力する必要があります。
例えば、

  • クラス名 : HogeButton
  • プロジェクト名 : FooBar

なら、


$ git grep -l 'customClass="HogeButton">' | xargs sed -i '' -e 's/customClass="HogeButton">/customClass="HogeButton" customModule="FooBar" customModuleProvider="target">/g'

となります。
これで、Module未設定のものに関しては適切にModuleが設定されるようになります。
既に設定されているものには反映されません。

コマンドを打ち終わったら、git diff等で差分を確認したり、storyboardを開くなりして、
image
こんな感じでcurrentが設定されていることを確認します。

問題なければcommitして完了です。

techSwiftXcodeShell

NSLocalizedStringでkeyが見つからない時はkeyではなくて指定した文字列を出力する

2つのDictionaryを結合するextensionと演算子を書く