SwiftLintのRules一覧（2018年3月最新版）

[SwiftLint](https://github.com/realm/SwiftLint)のRulesについてまとめました。
なお、ルール一覧については下記コマンドにて確認が可能です。

```
swiftlint rules
```

また、この他、GitHub上には[Rules.md](https://realm.github.io/SwiftLint/rule-directory.html)も存在するので、そちらを確認すると最新のルール一覧が確認可能です。
あまりにも量が多いので、ここではopt-inのRulesについてのみまとめます。

# 追記
ここに記載の内容は2018年時点のもので古いです。
最新のルールは2023年時点で以下のURLにて公開されているのでこちらを参照してください。
https://realm.github.io/SwiftLint/rule-directory.html

# ルール一覧
## array_init
[Rules.mdのArray Initの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#array-init)
sequenceからArrayへの変換をする際に、`seq.map { $0 }`ではなく`Array(seq)`を使用する方が望ましいというもの。

## attributes
[Rules.mdのattributesの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#attributes)
`@objc`や`@IBOutlet`などの属性(attributes)はvarやimportに対するものの場合は同じ行に配置し、型や関数に対するものの場合は別の行に配置すべきというもの。

## closure_end_indentation
[Rules.mdのClosure End Indentationの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#closure-end-indentation)
クロージャーの最後の閉じ括弧はクロージャーの先頭の行のインデントに揃えるべきというもの。

## closure_spacing
[Rules.mdのClosure Spacingの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#closure-spacing)
クロージャーの式を記述する際に、中括弧の中の始まりと終わりの部分に１つだけスペースを入れるべきというもの。

## conditional_returns_on_newline
[Rules.mdのConditional Returns on Newlineの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#conditional-returns-on-newline)
条件文は新しい行でreturnすべきというもの。

```swift
// 正しい
guard true else {
  return true
}
// 警告が出る
guard true else { return true }
```

## contains_over_first_not_nil
[Rules.mdのContains over first not nilの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#contains-over-first-not-nil)
`first(where:) != nil`よりも`contains`の方が望ましいというもの。

```swift
// 正しい
let first = myList.first(where: { $0 % 2 == 0 })
// 警告が出る
myList.first { $0 % 2 == 0 } != nil
```

## discouraged_object_literal
[Rules.mdのDiscouraged Object Literalの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#discouraged-object-literal)
Object Literalよりもinitializersを使っての初期化の方が望ましいというもの。

```swift
// 正しい
let image = UIImage(named: aVariable)
// 警告が出る
let image = #imageLiteral(resourceName: "image.jpg")
```

## discouraged_optional_boolean
[Rules.mdのDiscouraged Optional Booleanの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#discouraged-optional-boolean)
OptionalのBoolean（`Bool?`）を使用するよりも、通常のBooleanを使用する方が望ましいというもの。

## empty_count
[Rules.mdのEmpty Countの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#empty-count)
配列のcountが0かどうかを比較する場合は、isEmptyを使用する方が良いというもの。

## explicit_acl
[Rules.mdのExplicit ACLの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#explicit-acl)
全ての宣言にAccess Control Levelのキーワード（public/privateなど）を記述すべきというもの。frameworkを提供する場合などに記述があると分かりやすいというのがその理由。

## explicit_enum_raw_value
[Rules.mdのExplicit Enum Raw Valueの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#explicit-enum-raw-value)
enumには明示的に値を指定しておく方が望ましいというもの。

## explicit_init
[Rules.mdのExplicit Initの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#explicit-init)
明示的に.init()を呼ばない方が良いというもの。

## explicit_top_level_acl
[Rules.mdのExplicit Top Level ACLの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#explicit-top-level-acl)
最上位の宣言では、アクセス制御レベル（public/privateなど）を明示的に指定する必要があるというもの。

## explicit_type_interface
[Rules.mdのExplicit Type Interfaceの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#explicit-type-interface)
プロパティには明示的に型を記述すべきというもの。

## extension_access_modifier
[Rules.mdのExtension Access Modifierの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#extension-access-modifier)
extensionのアクセス修飾子を使う方が望ましいというもの。ちょっと分かりにくいが、適切にextensionにアクセス修飾子（public/privateなど）が付与されていれば警告は出ないというもの。

```swift
// 正しい
extension Foo {
   private var bar: Int { return 1 }
   public var baz: Int { return 1 }
}
public extension Foo {
   var bar: Int { return 1 }
   var baz: Int { return 1 }
}
// 警告が出る
extension Foo {
   public var bar: Int { return 1 }
   public var baz: Int { return 1 }
}
```

## fatal_error_message
[Rules.mdのFatal Error Messageの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#fatal-error-message)
fatalErrorを使用するときは`fatalError("message")`のように何かしら文字列を入れるべきというもの。

## file_header
[Rules.mdのFile Headerの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#file-header)
ファイルのヘッダコメントは指定したプロジェクトパターンに合致しているか、もしくは除去されているべきというもの。
SwiftLintの設定ファイル(.swiftlint.yml)でそのプロジェクトパターンが指定できます（[設定例](https://github.com/realm/SwiftLint/blob/1cdee5e274d74ec9ff59d6429b4c9a4a17fd7393/.swiftlint.yml#L25-L33)）。

## first_where
[Rules.mdのFirst Whereの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#first-where)
配列で最初にマッチした要素を取得したい場合、`.filter { }.first`ではなく`.first(where:)`を使用するのが望ましいというもの。

## force_unwrapping
[Rules.mdのForce Unwrappingの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#force-unwrapping)
強制アンラップは使用しない方がいいというもの。ただしIBOutletなどでは警告は入らず、`dict["abc"]↓.bar("B")`などのアンラップに対して警告が出る。

## implicit_return
[Rules.mdのImplicit Returnの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#implicit-return)
クロージャーでは暗黙のreturnを活用すべきというもの。

```swift
// 正しい
foo.map { $0 + 1 }
// 警告がでる
foo.map { value in
  ↓return value + 1
}
```

## implicitly_unwrapped_optional
[Rules.mdのImplicitly Unwrapped Optionalの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#implicitly-unwrapped-optional)
可能な限り暗黙的なアンラップ（`let label: UILabel!`など）は避けるべきというもの。

## joined_default_parameter
[Rules.mdのJoined Default Parameterの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#joined-default-parameter)
`bar.joined(↓separator: "")`のようなデフォルトの区切り文字明示は避けて`bar.joined(separator: ",")`などのようにすべきというもの。

## let_var_whitespace
[Rules.mdのVariable Declaration Whitespaceの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#variable-declaration-whitespace)
let/varと他の式の間には空行を設けるべきというもの。

## literal_expression_end_indentation
[Rules.mdのLiteral Expression End Indentationの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#literal-expression-end-indentation)
array/dictionaryのリテラルのインデントは最初と最後を揃えるべきというもの。

## multiline_arguments
[Rules.mdのMultiline Argumentsの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#multiline-arguments)
引数は全て同じ行に書くか、もしくは行を分けるなら全ての引数１つ１つで改行すべきというもの。

## multiline_parameters
[Rules.mdのMultiline Parametersの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#multiline-parameters)
function/methodのパラメータは全て行に書くか、もしくは行を分けるなら全てのパラメータ１つ１つで改行すべきというもの。ちなみに、引数(arguments)とパラメータ(parameters)の違いは[こちら](https://stackoverflow.com/questions/3176310/difference-between-parameter-and-argument)にもあるようにfunctionの定義が書いてある箇所はパラメータで、それを呼び出す場所に書いてあるのは引数。すなわち、パラメータは関数内で使用されるもので、引数は関数が呼び出されたときに渡される値のこと。 

## nimble_operator
[Rules.mdのNimble Operatorの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#nimble-operator)
`Prefer Nimble operator overloads over free matcher functions.`（Nimble演算子のoverloadsはfree matcher関数よりも好ましい）が元の文章なのだけど、いまいちピンとこない。Nimbleというテストで使用するマッチャーにおいて、`expect(12).toNot(equal(10))`のような形式で書くよりも`expect(10) > 2`のようにシンプルで書く方が望ましいというもの。

## no_extension_access_modifier
[Rules.mdのNo Extension Access Modifierの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#no-extension-access-modifier)
extension_access_modifierの逆。extensionにアクセス修飾子を付けていると警告が発生する。

## no_grouping_extension
[Rules.mdのNo Grouping Extensionの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#no-grouping-extension)
同じソースファイル内でコードをまとめるために拡張子を使用すべきではないというもの。説明が少し分かりにくいが、同じファイル内で`struct`や`enum`などの`extension`が記述されていると警告が出る。

## number_separator
[Rules.mdのNumber Separatorの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#number-separator)
数値を表記する際には1000の単位が明確になる箇所に適切にアンダーバーを使用すべきというもの。`1_000_000.000_000_1`などは問題なく、`1000`や`10_0`などは警告が出る。

## object_literal
[Rules.mdのObject Literalの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#object-literal)

discouraged_object_literalの逆で、initializersよりもObject Literalを使っての初期化の方が望ましいというもの。

```swift
// 正しい
let image = #imageLiteral(resourceName: "image.jpg")
// 警告が出る
let image = UIImage(named: aVariable)
```

## operator_usage_whitespace
[Rules.mdのOperator Usage Whitespaceの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#operator-usage-whitespace)
演算子は前後に1つスペースを設けるべきというもの。

## overridden_super_call
[Rules.mdのOverridden methods call superの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#overridden-methods-call-super)
overrideする場合はsuperのメソッドを呼ぶべきというもの。

## override_in_extension
[Rules.mdのOverride in Extensionの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#override-in-extension)
extensionでvarなどをoverrideすべきでないというもの。

## pattern_matching_keywords
[Rules.mdのPattern Matching Keywordsの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#pattern-matching-keywords)
直訳すると、`タプルからキーワードを移動することにより、複数のパターンマッチングバインディングを組み合わせることができます`とのこと。いまいちイメージが付かないので、警告の出るパターンと正しいパターンで比較すると、以下のようになります。

```swift
// 正しい
switch foo {
    case let (x, y): break
}
switch foo {
    case .foo(let x): break
}
switch foo {
    case let .foo(x, y): break
}
switch foo {
    case .foo(let x), .bar(let x): break
}
// 警告が出る
switch foo {
    case (↓let x,  ↓let y): break
}
switch foo {
    case .foo(↓let x, ↓let y): break
}
switch foo {
    case (.yamlParsing(↓let x), .yamlParsing(↓let y)): break
}
switch foo {
    case (↓var x,  ↓var y): break
}
```

## prefixed_toplevel_constant
[Rules.mdのPrefixed Top-Level Constantの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#pattern-matching-keywords)
トップレベルの定数はk始まりにすべきというもの。古いフレームワークなどではよく見かける。

## private_action
[Rules.mdのPrivate Actionsの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#private-actions)
IBActionsはprivateにすべきというもの。

## private_outlet
[Rules.mdのPrivate Outletsの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#private-outlets)
IBOutletsはprivateにすべきというもの。

## prohibited_super_call
[Rules.mdのProhibited calls to superの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#prohibited-calls-to-super)
superメソッドを呼ぶべきではないというもの。overridden_super_callとは排他の関係。

## quick_discouraged_call
[Rules.mdのQuick Discouraged Callの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#quick-discouraged-call)
詳細は[このissue](https://github.com/realm/SwiftLint/issues/1781)を参照のこと。describeとcontextブロック内でのメソッド呼び出しとオブジェクト初期化が有害である可能性があるため、警告が出るもの。（[このissue](https://github.com/realm/SwiftLint/issues/1903)も合わせて参照のこと）

## quick_discouraged_focused_test
[Rules.mdのQuick Discouraged Focused Testの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#quick-discouraged-focused-test)
(fdescribe, fcontext, fitを使用した)フォーカステストを使用していない場合に警告が出るもの。[このissue](https://github.com/realm/SwiftLint/issues/1905)に記載されている通り、TDDを行う場合などによく利用される（詳細はissueかRules.mdを参照のこと）。

## quick_discouraged_pending_test
[Rules.mdのQuick Discouraged Pending Testの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#quick-discouraged-pending-test)
保留中のテストに対して警告を発する。[issue:#1909](https://github.com/realm/SwiftLint/issues/1909)を参照のこと。

## redundant_nil_coalescing
[Rules.mdのRedundant Nil Coalescingの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#redundant-nil-coalescing)
無駄なnil結合演算子に警告が出るもの。`Int?`型の`val`に対して`val ?? nil`はnilならnilを入れるという意味のないものになるため警告が出る。

## required_enum_case
[Rules.mdのRequired Enum Caseの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#required-enum-case)
列挙型がプロトコルに準拠する場合、特定のケースの実装が必要であるというもの。

## single_test_class
[Rules.mdのSingle Test Classの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#single-test-class)
テストファイルには、QuickSpecまたはXCTestCaseクラスが１つだけ含まれている必要があるというもの。

## sorted_first_last
[Rules.mdのMin or Max over Sorted First or Lastの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#min-or-max-over-sorted-first-or-last)
`sorted().first`または`sorted().last`を使用するより、`min()`または`max()`を使用する方が望ましいというもの。

## sorted_imports
[Rules.mdのSorted Importsの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#sorted-imports)
importはソートされているべきというもの。

## strict_fileprivate
[Rules.mdのStrict fileprivateの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#strict-fileprivate)
fileprivateは使用すべきではないというもの。

## switch_case_on_newline
[Rules.mdのSwitch Case on Newlineの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#switch-case-on-newline)
switch文のcase *:のあとは必ず改行すべきというもの。

## trailing_closure
[Rules.mdのTrailing Closureの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#trailing-closure)
可能であれば、末尾のクロージャ構文を使用すべきというもの。

## unneeded_parentheses_in_closure_argument
[Rules.mdのUnneeded Parentheses in Closure Argumentの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#unneeded-parentheses-in-closure-argument)
クロージャ引数を宣言するときは、括弧は必要ないので書かないようにすべきというもの。

## vertical_parameter_alignment_on_call
[Rules.mdのVertical Parameter Alignment On Callの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#vertical-parameter-alignment-on-call)
関数のパラメータの記述において、改行を挟む場合はパラメータの先頭位置を揃えるべきというもの。

## yoda_condition
[Rules.mdのYoda condition ruleの項](https://github.com/realm/SwiftLint/blob/master/Rules.md#yoda-condition-rule)
定数と変数の比較において、変数は左側に、定数は右側に配置すべきというもの。