はじめに
SwiftLintには、クラスやプロパティなどの並び順を強制するルールがあります。
| ルール名 | 概要 | 
|---|---|
| file_types_order | ファイル内の型の並び順を強制する | 
| type_contents_order | 型内のプロパティやメソッドの並び順を強制する | 
これらのルールを適用することで、必然的にコードが整理されて可読性が上がります。
しかし、並び順を覚えるのは大変です。
ぱっと見でどこに何を書けば(書いてあるか)わかるよう、テンプレートを作成しました。
ルールの例からほぼ変えていないので、公式を見るだけでもいいと思います。
https://github.com/realm/SwiftLint/blob/0.38.0/Rules.md#file-types-order
https://github.com/realm/SwiftLint/blob/0.38.0/Rules.md#type-contents-order
自分ルール
同じグループの場合、アクセス修飾子の大きいものから順に書きます。
( open → public → internal → fileprivate → private )
アクセス修飾子も同じ場合、読み下しやすい順に書きます。
class TestViewController: UIViewController {
    // MARK: Other Methods
    // privateよりinternalメソッドから先に書く
    func hoge() {}
    // 呼び出し側から先に書くと読み下しやすい
    private func foo() {
        bar()
    }
    private func bar() { }
}
準拠したプロトコルのメソッドは、 // MARK: {プロトコル名} としてOther Methodsの上に書きます。
// MARK: Protocols
protocol TestViewControllerDelegate: AnyObject {
    func didPressTrackedButton()
}
// MARK: Main Type
class TestViewController: UIViewController, TestViewControllerDelegate {
    // MARK: TestViewControllerDelegate
    func didPressTrackedButton() {
        // some code
    }
    // MARK: Other Methods
}
環境
- SwiftLint:0.38.0
 
テンプレート
// MARK: Protocols
protocol TestViewControllerDelegate: AnyObject {
    func didPressTrackedButton()
}
// MARK: Main Type
class TestViewController: UIViewController, TestViewControllerDelegate {
    // MARK: Type Aliases
    // MARK: Classes
    // MARK: Structs
    // MARK: Enums
    // MARK: Stored Type Properties
    // MARK: Stored Instance Properties
    // MARK: Computed Instance Properties
    // MARK: IBOutlets
    // MARK: Initializers
    // MARK: Type Methods
    // MARK: View Life-Cycle Methods
    // MARK: IBActions
    // MARK: TestViewControllerDelegate
    // MARK: Other Methods
    // MARK: Subscripts
}
// MARK: Extensions
extension TestViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        return UITableViewCell()
    }
}
おわりに
Xcode上で新しくファイルを追加したら、まず上記のコメントをコピペするのがオススメです。
コーディング後、未実装のグループのコメントを削除すると見通しがよくなります。