SwiftLintで追加・廃止されたルールまとめ(Swift 5.1.2→5.3.1版)

SwiftLintの記事はシリーズになっています。
記事を順番に読み進めると、SwiftLintを使いこなせるようになります。

- [Swiftの静的解析ツール「SwiftLint」のセットアップ方法](https://qiita.com/uhooi/items/bf888b53b4b8210108aa)
- [SwiftLintの全ルール一覧(Swift 4.2版)](https://qiita.com/uhooi/items/7f5d6cf2b240f60ba1ed)
- [SwiftLintで追加・変更・廃止されたルールまとめ(Swift 4.2→5.1.2版)](https://qiita.com/uhooi/items/8e9767c2e746f4171ded)
- SwiftLintで追加・廃止されたルールまとめ(Swift 5.1.2→5.3.1版)　__←イマココ__
- [SwiftLintのオレオレカスタムルール一覧](https://qiita.com/uhooi/items/9deb56416aaa81709f69)
- [SwiftLintのAnalyzeを使って高度な解析をする方法](https://qiita.com/uhooi/items/655655f56be8bd94b06d)
- [SwiftLintの設定ファイルをサーバーに配置して共有する方法](https://qiita.com/uhooi/items/b5b26caeeefd8dbe1afd)
- [SwiftLintの「Currently running SwiftLint x.y.z but configuration specified version a.b.c.」エラーの解決法](https://qiita.com/uhooi/items/b1f2f0df2822f04c2161)

## はじめに

本記事は [Swift/Kotlin愛好会 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/love_swift_kotlin) の7日目の記事です。

[SwiftLintで追加・変更・廃止されたルールまとめ(Swift 4.2→5.1.2版) - Qiita](https://qiita.com/uhooi/items/8e9767c2e746f4171ded) から2020/12/06現在の最新版までの間に、追加・廃止されたルールを解説します。
前回の記事を読んでいなくても読み進められますが、併せて読むことをオススメします。

## 比較方法

前回の記事や公式ドキュメント、リリースノートを参考に差分を抽出しました。
変更されたルールも書こうとしたのですが、リリースノートを見ると多かったので見送りました。

|ルール|数|
|:--|:--|
|追加|13|
|廃止|0|

※ソースでなくドキュメントを確認して調査したため、実際の数と異なる可能性があります。

## 環境

- OS：macOS Big Sur 11.0.1
- Swift：5.3.1
- Xcode：12.2 (12B45b)
- SwiftLint：0.42.0-rc.1  
0.42.0は正式リリースされていない

## 追加されたルール

### Comment Spacing

- 追加バージョン：0.42.0-rc.1
- デフォルト：有効

コメントはスラッシュの後ろにスペースを1つ以上空けるべきです。
https://realm.github.io/SwiftLint/comment_spacing.html

```swift
// bad
//Foo
///Foo

// good
// Foo
//  Foo
/// Foo
```

### Computed Accessors Order

- 追加バージョン：0.40.0
- デフォルト：有効

コンピューテッドプロパティのゲッターとセッターは、統一した順序にすべきです。
https://realm.github.io/SwiftLint/computed_accessors_order.html

```swift
// bad
class Foo {
    var foo: Int {
        set { _foo = newValue }
        get { 3 }
    }
}

// good
class Foo {
    var foo: Int {
        get { 3 }
        set { _foo = newValue }
    }
}
```

### Inclusive Language

- 追加バージョン：0.41.0
- デフォルト：有効

識別子は人種、性別、社会経済的地位に基づく差別を避けるために、包括的な言語を使うべきです。
https://realm.github.io/SwiftLint/inclusive_language.html

```swift
// bad
enum BlackList {
    case foo
    case bar
}

func updateWhiteList(add: String) {}

init(master: String, slave: String) {}

// good
enum DenyList {
    case foo
    case bar
}

func updateAllowList(add: String) {}

init(leader: String, follower: String) {}

enum WalletItemType {
    case visa
    case mastercard // `0.42.0-rc.1` からデフォルトで許可された
}
```

Twitterが提供している一覧が参考になります。
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">We’re starting with a set of words we want to move away from using in favor of more inclusive language, such as: <a href="https://t.co/6SMGd9celn">pic.twitter.com/6SMGd9celn</a></p>&mdash; Twitter Engineering (@TwitterEng) <a href="https://twitter.com/TwitterEng/status/1278733305190342656?ref_src=twsrc%5Etfw">July 2, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

### Orphaned Doc Comment

- 追加バージョン：0.38.2
- デフォルト：有効

ドキュメンテーションコメントは宣言に付けるべきです。
https://realm.github.io/SwiftLint/orphaned_doc_comment.html

```swift
// bad
/// My great property
// Not a doc string
var myGreatProperty: String!

// good
/// My great property
var myGreatProperty: String!
```

### Enum Case Associated Values Count

- 追加バージョン：0.38.1
- デフォルト：無効

列挙型のアソシエイテッドバリューは少なくすべきです。
https://realm.github.io/SwiftLint/enum_case_associated_values_count.html

```swift
// bad
enum Employee {
    case fullTime(name: String, retirement: Date, age: Int, designation: String, contactNumber: Int)
    case partTime(name: String, contractEndDate: Date, age: Int, designation: String, contactNumber: Int)
}

// good
enum Employee {
    case fullTime(name: String, retirement: Date, designation: String, contactNumber: Int)
    case partTime(name: String, age: Int, contractEndDate: Date)
}
```

### IBInspectable in Extension

- 追加バージョン：0.40.0
- デフォルト：無効

エクステンションで `@IBInspectable` のプロパティを追加すべきではありません。
https://realm.github.io/SwiftLint/ibinspectable_in_extension.html

```swift
// bad
extension Foo {
  @IBInspectable private var x: Int
}

// good
class Foo {
  @IBInspectable private var x: Int
}
```

### Indentation Width

- 追加バージョン：0.38.2
- デフォルト：無効

1つのタブまたは設定したスペースの量でコードをインデントすべきです。
https://realm.github.io/SwiftLint/indentation_width.html

```swift
// bad
firstLine
        secondLine

// good
firstLine
    secondLine
```

### Non-private XCTest member

- 追加バージョン：0.42.0-rc.1
- デフォルト：無効

テストクラスのテストでないメンバーはすべて `private` にすべきです。
https://realm.github.io/SwiftLint/non_private_xctest_member.html

```swift
// bad
class TotoTests: XCTestCase {
    var foo: Bar?

    func helperFunction() {}
}

// good
class TotoTests: XCTestCase {
    private var foo: Bar?

    private func helperFunction() {}
}
```

### Optional Enum Case Match

- 追加バージョン：0.38.1
- デフォルト：無効

オプショナルの列挙型は `?` を付けずにマッチすべきです。
https://realm.github.io/SwiftLint/optional_enum_case_matching.html

```swift
// bad
switch foo {
 case .bar?: break
 case .baz: break
 default: break
}

// good
switch foo {
 case .bar: break
 case .baz: break
 default: break
}
```

### Prefer Nimble

- 追加バージョン：0.41.0
- デフォルト：無効

`XCTAssert` よりNimbleのマッチャーを使うべきです。
https://realm.github.io/SwiftLint/prefer_nimble.html

```swift
// bad
XCTAssertEqual(foo, 1)

// good
expect(foo) == 1
```

### Prefer Self Type Over Type of Self

- 追加バージョン：0.38.1
- デフォルト：無効

`type(of: self)` より `Self` を使うべきです。
https://realm.github.io/SwiftLint/prefer_self_type_over_type_of_self.html

```swift
// bad
class Foo {
    func bar() {
        type(of: self).baz()
    }
}

// good
class Foo {
    func bar() {
        Self.baz()
    }
}
```

### Prefer Zero Over Explicit Init

- 追加バージョン：0.40.0
- デフォルト：無効

`CGPoint(x: 0, y: 0)` のようなパラメータが `0` のイニシャライザより `.zero` を使うべきです。
https://realm.github.io/SwiftLint/prefer_zero_over_explicit_init.html

```swift
// bad
CGPoint(x: 0.0, y: 0.0)
CGRect(x: 0, y: 0, width: 0, height: 0)
CGSize(width: 0, height: 0)
CGVector(dx: 0, dy: 0)

// good
.zero
.zero
.zero
.zero
```

### Test case accessibility

- 追加バージョン：0.41.0
- デフォルト：無効

テストケースにはテスト以外の `private` なメンバーのみ含まれるべきです。
https://realm.github.io/SwiftLint/test_case_accessibility.html

```swift
// bad
class FooTests: XCTestCase {
    var foo: String?

    func foobar() {}
}

// good
class FooTests: XCTestCase {
    private var foo: String?

    private func foobar() {}
}

```

「Non-private XCTest member」との違いがまだわかっていません。

## 廃止されたルール

なし

## おわりに

これでSwift 5.3.1でもSwiftLintを適切に使うことができます！

以上、 [Swift/Kotlin愛好会 Advent Calendar 2020](https://qiita.com/advent-calendar/2020/love_swift_kotlin) の7日目の記事でした。
明日も @uhooi の記事です。

## 参考リンク

- [Rule Directory Reference](https://realm.github.io/SwiftLint/rule-directory.html)
- [Releases · realm/SwiftLint](https://github.com/realm/SwiftLint/releases)
- [Feature/bump swiftlint to 0.41.0 by uhooi · Pull Request #141 · uhooi/UhooiPicBook](https://github.com/uhooi/UhooiPicBook/pull/141)