SwiftLint導入

# 最初に
この記事は、**Mac**に**SwiftLint**を導入する方法を記載した記事です。
記載時(2015/11/20)のバージョンは下記の通りです。

|対象  |バージョン  |
|---|---|
|SwiftLint|0.4.0|
|XCode|7.1.1|
|Mac|10.11.1|
|Homebrew|0.9.5|

# 導入方法
## Homebrewをインストールする
### Homebrewをお持ちでない方
[MacにHomebrewをインストールする](http://qiita.com/_daisuke/items/d3b2477d15ed2611a058)
上記のURLにMacにHomebrewをインストールする方法が記載されていますので、
インストールしてください。

### Homebrewをお持ちの方
念のため、`Homebrew`の`update`を行ってください

```bash
brew update
```

正常に`Homebrew`の`update`を行えた後に、念のためバージョンをご確認ください。
**2015/11/20**時点の最新バージョンは **0.9.5** です。

```bash
brew --version
0.9.5 (git revision 7714; last commit 2015-11-19)
```

## SwiftLintをインストールする
ターミナルで下記のコマンドを入力して、実行してください。

```bash
brew install swiftlint
```

### SwiftLintのインストールした時のログ

```bash
[syamaoka] brew install swiftlint                                                                               
==> Downloading https://homebrew.bintray.com/bottles/swiftlint-0.4.0.el_capitan.bottle.tar.gz
######################################################################## 100.0%
==> Pouring swiftlint-0.4.0.el_capitan.bottle.tar.gz
🍺  /usr/local/Cellar/swiftlint/0.4.0: 215 files, 55M
[syamaoka] swiftlint version
0.4.0
```
SwiftLintのバージョンが**0.4.0**であることを確認出来れば、SwiftLintのインストール完了です！

<font color=red>※注意：SwiftLintのバージョンが低い場合はConfigureを設定できない場合があるので、最新のものを入れるのを推奨致します。<font>

## XCodeのビルド時にLintされるように設定する
1. SwiftLintを適用したいプロジェクトを開きます
2. `TARGETS->Bulid Phases`を開きます
3. 左上にある+ボタンをクリックし`New Run Script Phase`をクリックします。
4. `Run Script`の項目に、下記のスクリプトに置換するとBuild時に静的解析を行うようになります。

```sh
if which swiftlint >/dev/null; then
  swiftlint
else
  echo "SwiftLint does not exist, download from https://github.com/realm/SwiftLint"
fi
```
**画像で手順も用意したので、順番通りに設定していけば大丈夫です。**
<img width="400" alt="swiftlint2.png" src="https://qiita-image-store.s3.amazonaws.com/0/30359/6533d39e-c609-e5da-95f6-237dda1f1564.png">

公式のXcode設定ページ：https://github.com/realm/SwiftLint#configuration

## 動作確認
&#x2318;+Bで、Bulidをしてください。
SwiftLintの動作確認が出来ましたら、**これで導入は終わりです！**
お疲れ様でしたm(_ _)m

# SwiftLintを導入したことによって、改善されたポイント
## if,for,while等の括弧
スタイルガイドに従うと、**if,for,while**は**括弧で囲みません**。
しかし、他の言語と同時に進めると、ついつい囲っちゃう時があるんですが、
SwiftLintを導入すると撲滅出来ます！

```swift
×
if (true) {
}
○ 
if true {
}
```
## セミコロン
スタイルガイドに従うと、**文末にセミコロンは書きません**。
しかし、上記に書いたのと同じでセミコロンが必須の言語があるので、ついつい癖で・・ってのがあると思いますが、これも撲滅出来ます

```swift
×
let hoge = 0;
○ 
let hoge = 0
```
## 空白
これは静的解析に任せないと、どこかは大体空白を忘れてる箇所があると思います。
細かいことですが、空白の位置は統一させましょう。

```swift
×
class Hoge: NSObject{
}
○
class Hoge: NSObject {
}
```
---
以上、一例を挙げましたが、その他にも**変数の文字数**など色々解析してくれます。
チーム開発する時にコーディングルールがあると、非常に有用なので是非導入していきましょう！

# カスタム
SwiftLintには、Configureファイルに
**どのファイルに静的解析を行うか、ルール毎にOn/Offを指定したり、制限する文字数の変更が出来ます**。

## Configure設定
ルートディレクトリに`.swiftlint.yml`ファイルを追加します。
公式にどのような項目を設定出来るのか記載してありますので、カスタマイズしていきましょう。
https://github.com/realm/SwiftLint#configuration

以下、僕のConfigureの設定情報です。
よければ参考にしてください！

```yaml
# 無効にするルール
disabled_rules:
- trailing_whitespace # 余分に改行がある方が視認性が上がる為、無効
- type_name # クラス名は長くして情報を詰めておく必要もある為、無効

# ルール一覧を表示
#- colon
#- control_statement
#- file_length
#- force_cast
#- function_body_length
#- leading_whitespace
#- line_length
#- nesting
#- operator_whitespace
#- return_arrow_whitespace
#- todo
#- trailing_newline
#- variable_name_max_length
#- variable_name_min_length
#- type_body_length
#- variable_name

# 一行の文字列制限を100文字から300文字に変更
line_length: 300

excluded: # Lint対象から外すファイルのあるパスを記述
- Pods

# クラスの行数
type_body_length:
- 200 # warning
- 400 # error

# 変数名の最大文字数
variable_name_max_length:
- 60 # warning
- 80 # error

# 変数名の最小文字数
variable_name_min_length:
- 1 # warning
- 0 # error

# 関数の長さ
function_body_length:
- 100 # warning
- 200 # error
```

# 感想
SwiftLintのバージョン**0.2.0**から、**Configure**を設定できるようになり、
やっと実用できるようになりました。
**0.2.0**から**0.4.0**までのバージョンアップは本当に早く、
今後もどんどん成長していく**Hotな静的解析ツール**ではないでしょうか。

# 引用元 & 参考
SwiftLint : https://github.com/realm/SwiftLint
MacにHomebrewをインストールする：http://qiita.com/_daisuke/items/d3b2477d15ed2611a058
SwiftLintを試してみた : http://qiita.com/ushisantoasobu/items/b494c9cf7d78a968b373
Swift スタイルガイド：https://github.com/github/swift-style-guide

# 追記 **2016/01/26**
https://github.com/realm/SwiftLint/releases/tag/0.7.1
0.7.1までバージョンアップしています。
SwiftLintの成長の早さに感動します:pray:

そこで僕が利用していて便利だなって思った、追加機能を３つ紹介いたします！

## Auto correct
https://github.com/realm/SwiftLint#auto-correct

```bash
swiftlint autocorrect
```

上記のコマンド一発で、簡易的なもの(:の位置や、スペース等)は修正してくれます。

## Disable a rule in code
https://github.com/realm/SwiftLint#disable-a-rule-in-code

```swift
// swiftlint:disable colon
let noWarning :String = "" // 警告が出ない

// swiftlint:enable colon
let hasWarning :String = "" // 警告が出る

// swiftlint:disable:next force_cast
let noWarning = NSNumber() as! Int
let hasWarning = NSNumber() as! Int
let noWarning3 = NSNumber() as! Int
// swiftlint:disable:previous force_cast

//以下の行だけルールを無効化できる
let noWarning2 = NSNumber() as! Int // swiftlint:disable:this force_cast
```
コード上で特定の箇所だけ無効化することが出来る機能が追加されました。

全てのコードでルールを満たすのは大変ですし、
逆にルールを守らない方がいい部分もあると思います。
なので、大変ありがたい機能追加です:pray:

## レガシーコードの抽出
:warning:`Swift constructors are preferred over legacy convenience functions`
こんな警告が出るようになりました。

具体的には`CGRectMake(0, 0, 100, 80)`でしたら、`CGRect(x: 0, y: 0, width: 100, height: 80)`で作成し直すことを推奨してくれます。