LoginSignup
174
162

More than 5 years have passed since last update.

SwiftLint導入

Last updated at Posted at 2015-11-20

最初に

この記事は、MacSwiftLintを導入する方法を記載した記事です。
記載時(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をお持ちの方

念のため、Homebrewupdateを行ってください

brew update

正常にHomebrewupdateを行えた後に、念のためバージョンをご確認ください。
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されるように設定する

  1. SwiftLintを適用したいプロジェクトを開きます
  2. TARGETS->Bulid Phasesを開きます
  3. 左上にある+ボタンをクリックしNew Run Script Phaseをクリックします。
  4. Run Scriptの項目に、下記のスクリプトに置換するとBuild時に静的解析を行うようになります。
if which swiftlint >/dev/null; then
  swiftlint
else
  echo "SwiftLint does not exist, download from https://github.com/realm/SwiftLint"
fi

画像で手順も用意したので、順番通りに設定していけば大丈夫です。
swiftlint2.png

公式の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の成長の早さに感動します:pray:

そこで僕が利用していて便利だなって思った、追加機能を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

コード上で特定の箇所だけ無効化することが出来る機能が追加されました。

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

レガシーコードの抽出

:warning:Swift constructors are preferred over legacy convenience functions
こんな警告が出るようになりました。

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

174
162
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
174
162