No more war, No more typo!

# はじめに
戦争や飢え、貧困など、クリスマスイブの今日でさえ、世界中では悲しい出来事がたくさん起きています。そのうちの一つがtypo, つまり誤植です。

<img width="350" alt="screenshot.png" src="https://qiita-image-store.s3.amazonaws.com/0/64665/30044d64-569d-0e54-e7fd-96ae10101c44.png">

コードレビューでtypoが見つかるとめちゃくちゃ恥ずかしい :imp: 
**typoの無い平和な世界を実現したい :angel:**
ということで、typoチェックをしてくれるXcode Source Editor Extensionを作りました。

# Xcode Source Editor Extension
大雑把にいうと、昔あった"Alcatraz"みたいなやつです。Xcodeが便利になります。
作り方は

- [Xcode Source Editor Extensionの世界(完全版)](https://speakerdeck.com/takasek/20170916-number-iosdc)
- [Xcode Source Editor Extension を使った Xcode プラグインの作り方](https://dev.classmethod.jp/smartphone/iphone/xcode-source-editor-extension-how-to-create/)
- [Xcode Source Editor Extension で複数のコマンドを定義する
](https://dev.classmethod.jp/smartphone/iphone/xcode-source-editor-extension-multiple-commands/)

などを参考にさせていただきました。

# NoMoreTypo
![256.png](https://qiita-image-store.s3.amazonaws.com/0/64665/c7d41836-5c3b-ef4d-b96e-450525015087.png)

NoMoreTypoは、XcodeでソースのtypoチェックをしてくれるExtensionです。
命名部分とString部分がチェック可能で、typoが見つかると単語候補とともに該当する行の下に表示されます。
<img width="706" alt="スクリーンショット 2017-12-07 12.24.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/64665/7e7735a0-f2dc-fcd7-e984-e0d0f3352f9a.png">

typoが見つからなかった場合は、ソースの先頭にこんな感じでコメントアウトがつきます。
<img width="204" alt="スクリーンショット 2017-12-07 12.25.17.png" src="https://qiita-image-store.s3.amazonaws.com/0/64665/1356c4a2-50ea-6c2c-4d2d-7daec4a0f8ea.png">



## 実装
まず、上のサイトではちょっとわからなかったところを交えつつ実装の話をします。

### プロジェクト名
実装ではExtensionのみを作るのではなく、macOSアプリにExtensionを載せるような形になります。なのでApplicationとExtensionで別の名前をつけないといけません。
[awesome-xcode-extensions](https://github.com/theswiftdev/awesome-xcode-extensions)を参考に、こんな風に命名しました。

```
Project: NoMoreTypoForXcode
Extension: NoMoreTypo
```

<img width="226" alt="スクリーンショット 2017-12-07 11.23.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/64665/c0e09f0f-1578-e2c6-ae02-fe67aed40e6e.png">


ApplicationをNoMoreTypoにして、ExtensionをNoMoreTypo Extensionなどの命名にしているものもありました。でもNavigationにはExtensionの方の名前で表示されるので、そちらをメインにすることにします。

<img width="250" alt="スクリーンショット 2017-12-07 11.26.15.png" src="https://qiita-image-store.s3.amazonaws.com/0/64665/9f07d343-9abb-d35d-97ec-080885e57f73.png">



### 正規表現を用いた文字列の切り出し
まずはじめに、命名部分を取り出します。

```
(?<=(^|\\s)(let|var|func|class|enum|struct)\\s)[a-zA-Z0-9_]+
```
この正規表現では、変数名/関数名/クラス名などを取得できます。命名に使えるのは英数字とアンダースコアのみなので、[a-zA-Z0-9_]+でカバーしています。
次に、取り出した命名部分を単語ごとに分けます。

```
[a-zA-Z][a-z]+
```

この正規表現では、

- キャメル記法
    - hogeFuga
    - HogeFuga
- スネーク記法
    - hoge_fuga
    
以上2つの記法を単語ごとに切り出すことができます。大文字スネーク記法のようなもの（HOGE_FUGA）は単語ごとに切り出せません。
正規表現はこちらの[iOSエンジニアの正規表現入門](https://qiita.com/shoheiyokoyama/items/5dc67fdc9e06a9dc5728)を参考にさせていただきました。

### タイポチェック
`NSSpellChecker`という便利なクラスを使ってタイポチェックを行います。なんと単語の候補まで教えてくれます。
iOSにも同じような機能で`UITextChecker`というものがあります。スゴイ！

### Xcode Source Editor Extensionの配布方法
そのままgithubにあげます。READMEに後述のインストール手順を書いておきましょう。

## 使い方
1. [NoMoreTypo](https://github.com/shiba1014/NoMoreTypo)を`git clone`
2. ApplicationとExtension両方の**Signing**を自分のDeveloper IDに変更
<img width="691" alt="スクリーンショット 2017-12-07 15.40.42.png" src="https://qiita-image-store.s3.amazonaws.com/0/64665/4f127e84-d402-93cc-ab1e-c8ccb4949e8e.png">

3. **Product** -> **Archive**
4. **Export** -> **Export App**
![スクリーンショット 2017-12-08 0.04.26.png](https://qiita-image-store.s3.amazonaws.com/0/64665/2112b0a8-5e5f-6f05-934b-c336f4a47b9f.png)

5. エクスポートしたNoMoreTypoForXcodeをアプリケーションフォルダに移動
6. NoMoreTypoForXcodeを起動
7. **Enable Extension**をクリック
8. システム環境設定の機能拡張パネルが開くので、**Xcode Source Extension**のタブでNoMoreTypoにチェックが入っていることを確認
9. Xcodeを再起動
10. **Editor** -> **NoMoreTypo**
    - **Check typo in name** -> 命名部分のtypoをチェック
    - **Check typo in String** -> ""で囲まれた文字列内のtypoをチェック

## 今後の展望
- ""の中で\\(変数)や\nなどを使っている場合、変数名やエスケープ文字まで取り出してしまうので、正規表現を改善する
- アプリ名などの造語が引っかかってしまわないように、typo判定しないリストをつける
- ソースコードに直接書き込むのではなく、もっといい感じにだす
    - 「コンソールに書き込めといいよね」とアドバイスをいただいたので調べてます

# まとめ
NoMoreTypoでtypoなき平和なコーディングライフを :tada:
Xcodeにこんな機能があったらなあと思うものはExtensionで意外と作れる :ok_woman: 

# 追記
NoMoreTypoのソースコードでめっちゃtypoしてました。
<img width="493" alt="InNoMoreTypo.png" src="https://qiita-image-store.s3.amazonaws.com/0/64665/98838dc3-9237-1530-aa60-d23c661317c0.png">