- 別の画面へ飛ぶためにViewControllerのimportを追加
- 外部の便利フレームワークを使うためにimportを追加
- コード上でUIを記述するためにimportを追加
- 内製のオレオレライブラリを使うためにimportを追加
このように、Objective-Cでimportをずらずらと追加していくと、下の画像のような状態になってしまうことがないでしょうか。
この煩わしさをなくすため、Xcodeでimportの順番を自動で整理してくれるプラグインを作ってみました。その名もImportSorterです。
ImportSorter
リポジトリ:manji602/ImportSorter
インストール方法
上記のリポジトリをcloneしてプロジェクトをビルドするか、以下のワンライナーを実行してください。
$ curl -fsSL http://github.com/manji602/ImportSorter/raw/master/Scripts/install.sh | sh
使い方
ctrl+s
を押すか、メニューからEdit->Import Sorter->Sort Import On Current File
をクリックしてください。
先ほどのimportは、このように綺麗に並び替えることが出来ます。
Roleについて
ImportSorterでは、Roleという概念を利用してimportされたファイルを区別し、そのRole毎にアルファベット順にソートします。
デフォルトでは、上の画像のように
- 自分自身のヘッダ
- フレームワークのヘッダ(
<>
で閉じられたヘッダ。// :: Framework ::
以下のヘッダ) - その他(
// :: Other ::
以下のヘッダ)
の順番で並ぶようになっています。
Roleをカスタマイズするには
プロジェクト内のObjCClassRole
というmoduleでroleを管理しているので、以下の部分を修正してください。
(1) ObjCClassRole.h
内のenum(ObjCImportClassRole
)
typedef NS_ENUM(NSInteger, ObjCImportClassRole) {
ObjCImportClassRoleSelf = 0,
ObjCImportClassRoleFramework,
ObjCImportClassRoleOther
};
ここに必要なRoleを追加してください。
(2) ObjCClassRole.m
内のgetImportClassRole
import宣言された行が引数として渡ってくるため、どの行をどのRoleにマッチさせたいかはこちらで定義してください。
(3) ObjCClassRole.m
内のlabelForClassRole
(1)で定義したRoleに付けるLabelを記述してください。Labelを定義する場合はソートのロジックの都合上、kClassRoleLabelPrefix
で始まるNSStringにしてください。
(4) ObjCClassRole.m
内のlastImportClassRoleIndex
(1)で定義したenumの末尾に該当する項目を記述してください。
Swiftでも
Swiftでコードを書く場合は、同じプロジェクト内で実装したファイルは自動で読み込まれるため、import宣言を記述する必要のあるファイルは少なくなると思います。
当プラグインはSwiftでのimport順のソートにも対応していますが、Objective-Cほどimportの量が多くなることはあまりないため、roleについては特に設定しておりません。
roleを変更する場合は上述のObjCClassRole
に該当するSwiftClassRole
内の同様の項目を編集してください。
終わりに
保存時(Command+S
)に自動でソートできないなど、まだまだ機能不足な面もあるので随時アップデートしていく予定です。また、ニーズが多ければAlcatrazに登録するつもりです。バグや機能改善等のPRもお待ちしています…!