最初に
この記事は、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をインストールする
上記のURLにMacにHomebrewをインストールする方法が記載されていますので、
インストールしてください。
Homebrewをお持ちの方
念のため、Homebrew
のupdate
を行ってください
brew update
正常にHomebrew
のupdate
を行えた後に、念のためバージョンをご確認ください。
2015/11/20時点の最新バージョンは 0.9.5 です。
brew --version
0.9.5 (git revision 7714; last commit 2015-11-19)
SwiftLintをインストールする
ターミナルで下記のコマンドを入力して、実行してください。
brew install swiftlint
SwiftLintのインストールした時のログ
[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のインストール完了です!
※注意:SwiftLintのバージョンが低い場合はConfigureを設定できない場合があるので、最新のものを入れるのを推奨致します。
XCodeのビルド時にLintされるように設定する
- SwiftLintを適用したいプロジェクトを開きます
-
TARGETS->Bulid Phases
を開きます - 左上にある+ボタンをクリックし
New Run Script Phase
をクリックします。 -
Run Script
の項目に、下記のスクリプトに置換するとBuild時に静的解析を行うようになります。
if which swiftlint >/dev/null; then
swiftlint
else
echo "SwiftLint does not exist, download from https://github.com/realm/SwiftLint"
fi
画像で手順も用意したので、順番通りに設定していけば大丈夫です。
公式のXcode設定ページ:https://github.com/realm/SwiftLint#configuration
動作確認
⌘+Bで、Bulidをしてください。
SwiftLintの動作確認が出来ましたら、これで導入は終わりです!
お疲れ様でしたm(_ _)m
SwiftLintを導入したことによって、改善されたポイント
if,for,while等の括弧
スタイルガイドに従うと、if,for,whileは括弧で囲みません。
しかし、他の言語と同時に進めると、ついつい囲っちゃう時があるんですが、
SwiftLintを導入すると撲滅出来ます!
×
if (true) {
}
○
if true {
}
セミコロン
スタイルガイドに従うと、文末にセミコロンは書きません。
しかし、上記に書いたのと同じでセミコロンが必須の言語があるので、ついつい癖で・・ってのがあると思いますが、これも撲滅出来ます
×
let hoge = 0;
○
let hoge = 0
空白
これは静的解析に任せないと、どこかは大体空白を忘れてる箇所があると思います。
細かいことですが、空白の位置は統一させましょう。
×
class Hoge: NSObject{
}
○
class Hoge: NSObject {
}
以上、一例を挙げましたが、その他にも変数の文字数など色々解析してくれます。
チーム開発する時にコーディングルールがあると、非常に有用なので是非導入していきましょう!
カスタム
SwiftLintには、Configureファイルに
どのファイルに静的解析を行うか、ルール毎にOn/Offを指定したり、制限する文字数の変更が出来ます。
Configure設定
ルートディレクトリに.swiftlint.yml
ファイルを追加します。
公式にどのような項目を設定出来るのか記載してありますので、カスタマイズしていきましょう。
https://github.com/realm/SwiftLint#configuration
以下、僕のConfigureの設定情報です。
よければ参考にしてください!
# 無効にするルール
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の成長の早さに感動します
そこで僕が利用していて便利だなって思った、追加機能を3つ紹介いたします!
Auto correct
swiftlint autocorrect
上記のコマンド一発で、簡易的なもの(:の位置や、スペース等)は修正してくれます。
Disable a rule in code
// 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
コード上で特定の箇所だけ無効化することが出来る機能が追加されました。
全てのコードでルールを満たすのは大変ですし、
逆にルールを守らない方がいい部分もあると思います。
なので、大変ありがたい機能追加です
レガシーコードの抽出
Swift constructors are preferred over legacy convenience functions
こんな警告が出るようになりました。
具体的にはCGRectMake(0, 0, 100, 80)
でしたら、CGRect(x: 0, y: 0, width: 100, height: 80)
で作成し直すことを推奨してくれます。