Files
SwiftLint/Rules.md
T
JP Simard 53d8a3aba9 Add UnusedPrivateDeclarationRule (#2385)
* Add UnusedPrivateDeclarationRule

* Temporarily disable UnusedPrivateDeclarationRule tests on Xcode 10

So we can merge UnusedPrivateDeclarationRule without having to wait
for CircleCI to update its Xcode 10 version.
2018-09-05 21:59:45 -07:00

20945 lines
302 KiB
Markdown

# Rules
* [AnyObject Protocol](#anyobject-protocol)
* [Array Init](#array-init)
* [Attributes](#attributes)
* [Block Based KVO](#block-based-kvo)
* [Class Delegate Protocol](#class-delegate-protocol)
* [Closing Brace Spacing](#closing-brace-spacing)
* [Closure Body Length](#closure-body-length)
* [Closure End Indentation](#closure-end-indentation)
* [Closure Parameter Position](#closure-parameter-position)
* [Closure Spacing](#closure-spacing)
* [Colon](#colon)
* [Comma Spacing](#comma-spacing)
* [Compiler Protocol Init](#compiler-protocol-init)
* [Conditional Returns on Newline](#conditional-returns-on-newline)
* [Contains over first not nil](#contains-over-first-not-nil)
* [Control Statement](#control-statement)
* [Convenience Type](#convenience-type)
* [Custom Rules](#custom-rules)
* [Cyclomatic Complexity](#cyclomatic-complexity)
* [Discarded Notification Center Observer](#discarded-notification-center-observer)
* [Discouraged Direct Initialization](#discouraged-direct-initialization)
* [Discouraged Object Literal](#discouraged-object-literal)
* [Discouraged Optional Boolean](#discouraged-optional-boolean)
* [Discouraged Optional Collection](#discouraged-optional-collection)
* [Dynamic Inline](#dynamic-inline)
* [Empty Count](#empty-count)
* [Empty Enum Arguments](#empty-enum-arguments)
* [Empty Parameters](#empty-parameters)
* [Empty Parentheses with Trailing Closure](#empty-parentheses-with-trailing-closure)
* [Empty String](#empty-string)
* [Empty XCTest Method](#empty-xctest-method)
* [Explicit ACL](#explicit-acl)
* [Explicit Enum Raw Value](#explicit-enum-raw-value)
* [Explicit Init](#explicit-init)
* [Explicit Self](#explicit-self)
* [Explicit Top Level ACL](#explicit-top-level-acl)
* [Explicit Type Interface](#explicit-type-interface)
* [Extension Access Modifier](#extension-access-modifier)
* [Fallthrough](#fallthrough)
* [Fatal Error Message](#fatal-error-message)
* [File Header](#file-header)
* [File Line Length](#file-line-length)
* [File Name](#file-name)
* [First Where](#first-where)
* [For Where](#for-where)
* [Force Cast](#force-cast)
* [Force Try](#force-try)
* [Force Unwrapping](#force-unwrapping)
* [Function Body Length](#function-body-length)
* [Function Default Parameter at End](#function-default-parameter-at-end)
* [Function Parameter Count](#function-parameter-count)
* [Generic Type Name](#generic-type-name)
* [Identifier Name](#identifier-name)
* [Implicit Getter](#implicit-getter)
* [Implicit Return](#implicit-return)
* [Implicitly Unwrapped Optional](#implicitly-unwrapped-optional)
* [Inert Defer](#inert-defer)
* [Is Disjoint](#is-disjoint)
* [Joined Default Parameter](#joined-default-parameter)
* [Large Tuple](#large-tuple)
* [Leading Whitespace](#leading-whitespace)
* [Legacy CGGeometry Functions](#legacy-cggeometry-functions)
* [Legacy Constant](#legacy-constant)
* [Legacy Constructor](#legacy-constructor)
* [Legacy NSGeometry Functions](#legacy-nsgeometry-functions)
* [Variable Declaration Whitespace](#variable-declaration-whitespace)
* [Line Length](#line-length)
* [Literal Expression End Indentation](#literal-expression-end-indentation)
* [Lower ACL than parent](#lower-acl-than-parent)
* [Mark](#mark)
* [Missing Docs](#missing-docs)
* [Modifier Order](#modifier-order)
* [Multiline Arguments](#multiline-arguments)
* [Multiline Function Chains](#multiline-function-chains)
* [Multiline Parameters](#multiline-parameters)
* [Multiple Closures with Trailing Closure](#multiple-closures-with-trailing-closure)
* [Nesting](#nesting)
* [Nimble Operator](#nimble-operator)
* [No Extension Access Modifier](#no-extension-access-modifier)
* [No Fallthrough Only](#no-fallthrough-only)
* [No Grouping Extension](#no-grouping-extension)
* [Notification Center Detachment](#notification-center-detachment)
* [Number Separator](#number-separator)
* [Object Literal](#object-literal)
* [Opening Brace Spacing](#opening-brace-spacing)
* [Operator Usage Whitespace](#operator-usage-whitespace)
* [Operator Function Whitespace](#operator-function-whitespace)
* [Overridden methods call super](#overridden-methods-call-super)
* [Override in Extension](#override-in-extension)
* [Pattern Matching Keywords](#pattern-matching-keywords)
* [Prefixed Top-Level Constant](#prefixed-top-level-constant)
* [Private Actions](#private-actions)
* [Private Outlets](#private-outlets)
* [Private over fileprivate](#private-over-fileprivate)
* [Private Unit Test](#private-unit-test)
* [Prohibited Interface Builder](#prohibited-interface-builder)
* [Prohibited calls to super](#prohibited-calls-to-super)
* [Protocol Property Accessors Order](#protocol-property-accessors-order)
* [Quick Discouraged Call](#quick-discouraged-call)
* [Quick Discouraged Focused Test](#quick-discouraged-focused-test)
* [Quick Discouraged Pending Test](#quick-discouraged-pending-test)
* [Redundant Discardable Let](#redundant-discardable-let)
* [Redundant Nil Coalescing](#redundant-nil-coalescing)
* [Redundant Optional Initialization](#redundant-optional-initialization)
* [Redundant Set Access Control Rule](#redundant-set-access-control-rule)
* [Redundant String Enum Value](#redundant-string-enum-value)
* [Redundant Type Annotation](#redundant-type-annotation)
* [Redundant Void Return](#redundant-void-return)
* [Required Enum Case](#required-enum-case)
* [Returning Whitespace](#returning-whitespace)
* [Shorthand Operator](#shorthand-operator)
* [Single Test Class](#single-test-class)
* [Min or Max over Sorted First or Last](#min-or-max-over-sorted-first-or-last)
* [Sorted Imports](#sorted-imports)
* [Statement Position](#statement-position)
* [Strict fileprivate](#strict-fileprivate)
* [Superfluous Disable Command](#superfluous-disable-command)
* [Switch and Case Statement Alignment](#switch-and-case-statement-alignment)
* [Switch Case on Newline](#switch-case-on-newline)
* [Syntactic Sugar](#syntactic-sugar)
* [Todo](#todo)
* [Toggle Bool](#toggle-bool)
* [Trailing Closure](#trailing-closure)
* [Trailing Comma](#trailing-comma)
* [Trailing Newline](#trailing-newline)
* [Trailing Semicolon](#trailing-semicolon)
* [Trailing Whitespace](#trailing-whitespace)
* [Type Body Length](#type-body-length)
* [Type Name](#type-name)
* [Unavailable Function](#unavailable-function)
* [Unneeded Break in Switch](#unneeded-break-in-switch)
* [Unneeded Parentheses in Closure Argument](#unneeded-parentheses-in-closure-argument)
* [Untyped Error in Catch](#untyped-error-in-catch)
* [Unused Closure Parameter](#unused-closure-parameter)
* [Unused Enumerated](#unused-enumerated)
* [Unused Import](#unused-import)
* [Unused Optional Binding](#unused-optional-binding)
* [Unused Private Declaration](#unused-private-declaration)
* [Valid IBInspectable](#valid-ibinspectable)
* [Vertical Parameter Alignment](#vertical-parameter-alignment)
* [Vertical Parameter Alignment On Call](#vertical-parameter-alignment-on-call)
* [Vertical Whitespace](#vertical-whitespace)
* [Void Return](#void-return)
* [Weak Delegate](#weak-delegate)
* [XCTFail Message](#xctfail-message)
* [Yoda condition rule](#yoda-condition-rule)
--------
## AnyObject Protocol
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`anyobject_protocol` | Disabled | Yes | lint | No | 4.1.0
Prefer using `AnyObject` over `class` for class-only protocols.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
protocol SomeProtocol {}
```
```swift
protocol SomeClassOnlyProtocol: AnyObject {}
```
```swift
protocol SomeClassOnlyProtocol: AnyObject, SomeInheritedProtocol {}
```
```swift
@objc protocol SomeClassOnlyProtocol: AnyObject, SomeInheritedProtocol {}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
protocol SomeClassOnlyProtocol: class {}
```
```swift
protocol SomeClassOnlyProtocol: class, SomeInheritedProtocol {}
```
```swift
@objc protocol SomeClassOnlyProtocol: class, SomeInheritedProtocol {}
```
</details>
## Array Init
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`array_init` | Disabled | No | lint | No | 3.0.0
Prefer using `Array(seq)` over `seq.map { $0 }` to convert a sequence into an Array.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
Array(foo)
```
```swift
foo.map { $0.0 }
```
```swift
foo.map { $1 }
```
```swift
foo.map { $0() }
```
```swift
foo.map { ((), $0) }
```
```swift
foo.map { $0! }
```
```swift
foo.map { $0! /* force unwrap */ }
```
```swift
foo.something { RouteMapper.map($0) }
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
foo.map({ $0 })
```
```swift
foo.map { $0 }
```
```swift
foo.map { return $0 }
```
```swift
foo.map { elem in
elem
}
```
```swift
foo.map { elem in
return elem
}
```
```swift
foo.map { (elem: String) in
elem
}
```
```swift
foo.map { elem -> String in
elem
}
```
```swift
foo.map { $0 /* a comment */ }
```
</details>
## Attributes
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`attributes` | Disabled | No | style | No | 3.0.0
Attributes should be on their own lines in functions and types, but on the same line as variables and imports.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
@objc var x: String
```
```swift
@objc private var x: String
```
```swift
@nonobjc var x: String
```
```swift
@IBOutlet private var label: UILabel
```
```swift
@IBOutlet @objc private var label: UILabel
```
```swift
@NSCopying var name: NSString
```
```swift
@NSManaged var name: String?
```
```swift
@IBInspectable var cornerRadius: CGFloat
```
```swift
@available(iOS 9.0, *)
let stackView: UIStackView
```
```swift
@NSManaged func addSomeObject(book: SomeObject)
```
```swift
@IBAction func buttonPressed(button: UIButton)
```
```swift
@objc
@IBAction func buttonPressed(button: UIButton)
```
```swift
@available(iOS 9.0, *)
func animate(view: UIStackView)
```
```swift
@available(iOS 9.0, *, message="A message")
func animate(view: UIStackView)
```
```swift
@nonobjc
final class X
```
```swift
@available(iOS 9.0, *)
class UIStackView
```
```swift
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate
```
```swift
@UIApplicationMain
class AppDelegate: NSObject, UIApplicationDelegate
```
```swift
@IBDesignable
class MyCustomView: UIView
```
```swift
@testable import SourceKittenFramework
```
```swift
@objc(foo_x)
var x: String
```
```swift
@available(iOS 9.0, *)
@objc(abc_stackView)
let stackView: UIStackView
```
```swift
@objc(abc_addSomeObject:)
@NSManaged func addSomeObject(book: SomeObject)
```
```swift
@objc(ABCThing)
@available(iOS 9.0, *)
class Thing
```
```swift
class Foo: NSObject {
override var description: String { return "" }
}
```
```swift
class Foo: NSObject {
override func setUp() {}
}
```
```swift
@objc
class {}
```
```swift
extension Property {
@available(*, unavailable, renamed: "isOptional")
public var optional: Bool { fatalError() }
}
```
```swift
@GKInspectable var maxSpeed: Float
```
```swift
@discardableResult
func a() -> Int
```
```swift
@objc
@discardableResult
func a() -> Int
```
```swift
func increase(f: @autoclosure () -> Int) -> Int
```
```swift
func foo(completionHandler: @escaping () -> Void)
```
```swift
private struct DefaultError: Error {}
```
```swift
@testable import foo
private let bar = 1
```
```swift
import XCTest
@testable import DeleteMe
@available (iOS 11.0, *)
class DeleteMeTests: XCTestCase {
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
@objc
var x: String
```
```swift
@objc
var x: String
```
```swift
@objc
private var x: String
```
```swift
@nonobjc
var x: String
```
```swift
@IBOutlet
private var label: UILabel
```
```swift
@IBOutlet
private var label: UILabel
```
```swift
@NSCopying
var name: NSString
```
```swift
@NSManaged
var name: String?
```
```swift
@IBInspectable
var cornerRadius: CGFloat
```
```swift
@available(iOS 9.0, *) let stackView: UIStackView
```
```swift
@NSManaged
func addSomeObject(book: SomeObject)
```
```swift
@IBAction
func buttonPressed(button: UIButton)
```
```swift
@IBAction
@objc
func buttonPressed(button: UIButton)
```
```swift
@available(iOS 9.0, *) func animate(view: UIStackView)
```
```swift
@nonobjc final class X
```
```swift
@available(iOS 9.0, *) class UIStackView
```
```swift
@available(iOS 9.0, *)
@objc class UIStackView
```
```swift
@available(iOS 9.0, *) @objc
class UIStackView
```
```swift
@available(iOS 9.0, *)
class UIStackView
```
```swift
@UIApplicationMain class AppDelegate: NSObject, UIApplicationDelegate
```
```swift
@IBDesignable class MyCustomView: UIView
```
```swift
@testable
import SourceKittenFramework
```
```swift
@testable
import SourceKittenFramework
```
```swift
@objc(foo_x) var x: String
```
```swift
@available(iOS 9.0, *) @objc(abc_stackView)
let stackView: UIStackView
```
```swift
@objc(abc_addSomeObject:) @NSManaged
func addSomeObject(book: SomeObject)
```
```swift
@objc(abc_addSomeObject:)
@NSManaged
func addSomeObject(book: SomeObject)
```
```swift
@available(iOS 9.0, *)
@objc(ABCThing) class Thing
```
```swift
@GKInspectable
var maxSpeed: Float
```
```swift
@discardableResult func a() -> Int
```
```swift
@objc
@discardableResult func a() -> Int
```
```swift
@objc
@discardableResult
func a() -> Int
```
</details>
## Block Based KVO
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`block_based_kvo` | Enabled | No | idiomatic | No | 3.0.0
Prefer the new block based KVO API with keypaths when using Swift 3.2 or later.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let observer = foo.observe(\.value, options: [.new]) { (foo, change) in
print(change.newValue)
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
class Foo: NSObject {
override func observeValue(forKeyPath keyPath: String?, of object: Any?,
change: [NSKeyValueChangeKey : Any]?,
context: UnsafeMutableRawPointer?) {}
}
```
```swift
class Foo: NSObject {
override func observeValue(forKeyPath keyPath: String?, of object: Any?,
change: Dictionary<NSKeyValueChangeKey, Any>?,
context: UnsafeMutableRawPointer?) {}
}
```
</details>
## Class Delegate Protocol
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`class_delegate_protocol` | Enabled | No | lint | No | 3.0.0
Delegate protocols should be class-only so they can be weakly referenced.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
protocol FooDelegate: class {}
```
```swift
protocol FooDelegate: class, BarDelegate {}
```
```swift
protocol Foo {}
```
```swift
class FooDelegate {}
```
```swift
@objc protocol FooDelegate {}
```
```swift
@objc(MyFooDelegate)
protocol FooDelegate {}
```
```swift
protocol FooDelegate: BarDelegate {}
```
```swift
protocol FooDelegate: AnyObject {}
```
```swift
protocol FooDelegate: NSObjectProtocol {}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
protocol FooDelegate {}
```
```swift
protocol FooDelegate: Bar {}
```
</details>
## Closing Brace Spacing
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`closing_brace` | Enabled | Yes | style | No | 3.0.0
Closing brace with closing parenthesis should not have any whitespaces in the middle.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
[].map({ })
```
```swift
[].map(
{ }
)
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
[].map({ } )
```
```swift
[].map({ } )
```
</details>
## Closure Body Length
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`closure_body_length` | Disabled | No | metrics | No | 4.2.0
Closure bodies should not span too many lines.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
foo.bar { $0 }
```
```swift
foo.bar { toto in
}
```
```swift
foo.bar { toto in
let a = 0
// toto
// toto
// toto
// toto
// toto
// toto
// toto
// toto
// toto
// toto
}
```
```swift
foo.bar { toto in
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
}
```
```swift
foo.bar { toto in
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
// toto
// toto
// toto
// toto
// toto
// toto
// toto
// toto
// toto
// toto
}
```
```swift
foo.bar({ toto in
})
```
```swift
foo.bar({ toto in
let a = 0
})
```
```swift
foo.bar({ toto in
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
})
```
```swift
foo.bar(label: { toto in
})
```
```swift
foo.bar(label: { toto in
let a = 0
})
```
```swift
foo.bar(label: { toto in
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
})
```
```swift
foo.bar(label: { toto in
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
}, anotherLabel: { toto in
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
})
```
```swift
foo.bar(label: { toto in
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
}) { toto in
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
}
```
```swift
let foo: Bar = { toto in
let bar = Bar()
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
return bar
}()
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
foo.bar { toto in
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
}
```
```swift
foo.bar { toto in
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
// toto
// toto
// toto
// toto
// toto
// toto
// toto
// toto
// toto
// toto
}
```
```swift
foo.bar({ toto in
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
})
```
```swift
foo.bar(label: { toto in
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
})
```
```swift
foo.bar(label: { toto in
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
}, anotherLabel: { toto in
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
})
```
```swift
foo.bar(label: { toto in
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
}) { toto in
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
}
```
```swift
let foo: Bar = { toto in
let bar = Bar()
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
let a = 0
return bar
}()
```
</details>
## Closure End Indentation
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`closure_end_indentation` | Disabled | Yes | style | No | 3.0.0
Closure end should have the same indentation as the line that started it.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
SignalProducer(values: [1, 2, 3])
.startWithNext { number in
print(number)
}
```
```swift
[1, 2].map { $0 + 1 }
```
```swift
return match(pattern: pattern, with: [.comment]).flatMap { range in
return Command(string: contents, range: range)
}.flatMap { command in
return command.expand()
}
```
```swift
foo(foo: bar,
options: baz) { _ in }
```
```swift
someReallyLongProperty.chainingWithAnotherProperty
.foo { _ in }
```
```swift
foo(abc, 123)
{ _ in }
```
```swift
function(
closure: { x in
print(x)
},
anotherClosure: { y in
print(y)
})
```
```swift
function(parameter: param,
closure: { x in
print(x)
})
```
```swift
function(parameter: param, closure: { x in
print(x)
},
anotherClosure: { y in
print(y)
})
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
SignalProducer(values: [1, 2, 3])
.startWithNext { number in
print(number)
}
```
```swift
return match(pattern: pattern, with: [.comment]).flatMap { range in
return Command(string: contents, range: range)
}.flatMap { command in
return command.expand()
}
```
```swift
function(
closure: { x in
print(x)
},
anotherClosure: { y in
print(y)
})
```
</details>
## Closure Parameter Position
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`closure_parameter_position` | Enabled | No | style | No | 3.0.0
Closure parameters should be on the same line as opening brace.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
[1, 2].map { $0 + 1 }
```
```swift
[1, 2].map({ $0 + 1 })
```
```swift
[1, 2].map { number in
number + 1
}
```
```swift
[1, 2].map { number -> Int in
number + 1
}
```
```swift
[1, 2].map { (number: Int) -> Int in
number + 1
}
```
```swift
[1, 2].map { [weak self] number in
number + 1
}
```
```swift
[1, 2].something(closure: { number in
number + 1
})
```
```swift
let isEmpty = [1, 2].isEmpty()
```
```swift
rlmConfiguration.migrationBlock.map { rlmMigration in
return { migration, schemaVersion in
rlmMigration(migration.rlmMigration, schemaVersion)
}
}
```
```swift
let mediaView: UIView = { [weak self] index in
return UIView()
}(index)
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
[1, 2].map {
number in
number + 1
}
```
```swift
[1, 2].map {
number -> Int in
number + 1
}
```
```swift
[1, 2].map {
(number: Int) -> Int in
number + 1
}
```
```swift
[1, 2].map {
[weak self] number in
number + 1
}
```
```swift
[1, 2].map { [weak self]
number in
number + 1
}
```
```swift
[1, 2].map({
number in
number + 1
})
```
```swift
[1, 2].something(closure: {
number in
number + 1
})
```
```swift
[1, 2].reduce(0) {
sum, number in
number + sum
}
```
</details>
## Closure Spacing
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`closure_spacing` | Disabled | Yes | style | No | 3.0.0
Closure expressions should have a single space inside each brace.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
[].map ({ $0.description })
```
```swift
[].filter { $0.contains(location) }
```
```swift
extension UITableViewCell: ReusableView { }
```
```swift
extension UITableViewCell: ReusableView {}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
[].filter({$0.contains(location)})
```
```swift
[].map({$0})
```
```swift
({each in return result.contains(where: {e in return e}) }).count
```
```swift
filter { sorted { $0 < $1}}
```
</details>
## Colon
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`colon` | Enabled | Yes | style | No | 3.0.0
Colons should be next to the identifier when specifying a type and next to the key in dictionary literals.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let abc: Void
```
```swift
let abc: [Void: Void]
```
```swift
let abc: (Void, Void)
```
```swift
let abc: ([Void], String, Int)
```
```swift
let abc: [([Void], String, Int)]
```
```swift
let abc: String="def"
```
```swift
let abc: Int=0
```
```swift
let abc: Enum=Enum.Value
```
```swift
func abc(def: Void) {}
```
```swift
func abc(def: Void, ghi: Void) {}
```
```swift
// 周斌佳年周斌佳
let abc: String = "abc:"
```
```swift
let abc = [Void: Void]()
```
```swift
let abc = [1: [3: 2], 3: 4]
```
```swift
let abc = ["string": "string"]
```
```swift
let abc = ["string:string": "string"]
```
```swift
let abc: [String: Int]
```
```swift
func foo(bar: [String: Int]) {}
```
```swift
func foo() -> [String: Int] { return [:] }
```
```swift
let abc: Any
```
```swift
let abc: [Any: Int]
```
```swift
let abc: [String: Any]
```
```swift
class Foo: Bar {}
```
```swift
class Foo<T: Equatable> {}
```
```swift
switch foo {
case .bar:
_ = something()
}
```
```swift
object.method(x: 5, y: "string")
```
```swift
object.method(x: 5, y:
"string")
```
```swift
object.method(5, y: "string")
```
```swift
func abc() { def(ghi: jkl) }
```
```swift
func abc(def: Void) { ghi(jkl: mno) }
```
```swift
class ABC { let def = ghi(jkl: mno) } }
```
```swift
func foo() { let dict = [1: 1] }
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
let abc:Void
```
```swift
let abc: Void
```
```swift
let abc :Void
```
```swift
let abc : Void
```
```swift
let abc : [Void: Void]
```
```swift
let abc : (Void, String, Int)
```
```swift
let abc : ([Void], String, Int)
```
```swift
let abc : [([Void], String, Int)]
```
```swift
let abc: (Void, String, Int)
```
```swift
let abc: ([Void], String, Int)
```
```swift
let abc: [([Void], String, Int)]
```
```swift
let abc :String="def"
```
```swift
let abc :Int=0
```
```swift
let abc :Int = 0
```
```swift
let abc:Int=0
```
```swift
let abc:Int = 0
```
```swift
let abc:Enum=Enum.Value
```
```swift
func abc(def:Void) {}
```
```swift
func abc(def: Void) {}
```
```swift
func abc(def :Void) {}
```
```swift
func abc(def : Void) {}
```
```swift
func abc(def: Void, ghi :Void) {}
```
```swift
let abc = [Void:Void]()
```
```swift
let abc = [Void : Void]()
```
```swift
let abc = [Void: Void]()
```
```swift
let abc = [Void : Void]()
```
```swift
let abc = [1: [3 : 2], 3: 4]
```
```swift
let abc = [1: [3 : 2], 3: 4]
```
```swift
let abc: [String : Int]
```
```swift
let abc: [String:Int]
```
```swift
func foo(bar: [String : Int]) {}
```
```swift
func foo(bar: [String:Int]) {}
```
```swift
func foo() -> [String : Int] { return [:] }
```
```swift
func foo() -> [String:Int] { return [:] }
```
```swift
let abc : Any
```
```swift
let abc: [Any : Int]
```
```swift
let abc: [String : Any]
```
```swift
class Foo : Bar {}
```
```swift
class Foo:Bar {}
```
```swift
class Foo<T:Equatable> {}
```
```swift
class Foo<T : Equatable> {}
```
```swift
object.method(x: 5, y : "string")
```
```swift
object.method(x:5, y: "string")
```
```swift
object.method(x: 5, y: "string")
```
```swift
func abc() { def(ghi:jkl) }
```
```swift
func abc(def: Void) { ghi(jkl:mno) }
```
```swift
class ABC { let def = ghi(jkl:mno) } }
```
```swift
func foo() { let dict = [1 : 1] }
```
</details>
## Comma Spacing
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`comma` | Enabled | Yes | style | No | 3.0.0
There should be no space before and one after any comma.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
func abc(a: String, b: String) { }
```
```swift
abc(a: "string", b: "string"
```
```swift
enum a { case a, b, c }
```
```swift
func abc(
a: String, // comment
bcd: String // comment
) {
}
```
```swift
func abc(
a: String,
bcd: String
) {
}
```
```swift
#imageLiteral(resourceName: "foo,bar,baz")
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
func abc(a: String ,b: String) { }
```
```swift
func abc(a: String ,b: String ,c: String ,d: String) { }
```
```swift
abc(a: "string",b: "string"
```
```swift
enum a { case a ,b }
```
```swift
let result = plus(
first: 3 , // #683
second: 4
)
```
</details>
## Compiler Protocol Init
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`compiler_protocol_init` | Enabled | No | lint | No | 3.0.0
The initializers declared in compiler protocols such as `ExpressibleByArrayLiteral` shouldn't be called directly.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let set: Set<Int> = [1, 2]
```
```swift
let set = Set(array)
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
let set = Set(arrayLiteral: 1, 2)
```
```swift
let set = Set.init(arrayLiteral: 1, 2)
```
</details>
## Conditional Returns on Newline
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`conditional_returns_on_newline` | Disabled | No | style | No | 3.0.0
Conditional statements should always return on the next line
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
guard true else {
return true
}
```
```swift
guard true,
let x = true else {
return true
}
```
```swift
if true else {
return true
}
```
```swift
if true,
let x = true else {
return true
}
```
```swift
if textField.returnKeyType == .Next {
```
```swift
if true { // return }
```
```swift
/*if true { */ return }
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
guard true else { return }
```
```swift
if true { return }
```
```swift
if true { break } else { return }
```
```swift
if true { break } else { return }
```
```swift
if true { return "YES" } else { return "NO" }
```
</details>
## Contains over first not nil
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`contains_over_first_not_nil` | Disabled | No | performance | No | 3.0.0
Prefer `contains` over `first(where:) != nil`
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let first = myList.first(where: { $0 % 2 == 0 })
```
```swift
let first = myList.first { $0 % 2 == 0 }
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
myList.first { $0 % 2 == 0 } != nil
```
```swift
myList.first(where: { $0 % 2 == 0 }) != nil
```
```swift
myList.map { $0 + 1 }.first(where: { $0 % 2 == 0 }) != nil
```
```swift
myList.first(where: someFunction) != nil
```
```swift
myList.map { $0 + 1 }.first { $0 % 2 == 0 } != nil
```
```swift
(myList.first { $0 % 2 == 0 }) != nil
```
</details>
## Control Statement
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`control_statement` | Enabled | No | style | No | 3.0.0
`if`, `for`, `guard`, `switch`, `while`, and `catch` statements shouldn't unnecessarily wrap their conditionals or arguments in parentheses.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
if condition {
```
```swift
if (a, b) == (0, 1) {
```
```swift
if (a || b) && (c || d) {
```
```swift
if (min...max).contains(value) {
```
```swift
if renderGif(data) {
```
```swift
renderGif(data)
```
```swift
for item in collection {
```
```swift
for (key, value) in dictionary {
```
```swift
for (index, value) in enumerate(array) {
```
```swift
for var index = 0; index < 42; index++ {
```
```swift
guard condition else {
```
```swift
while condition {
```
```swift
} while condition {
```
```swift
do { ; } while condition {
```
```swift
switch foo {
```
```swift
do {
} catch let error as NSError {
}
```
```swift
foo().catch(all: true) {}
```
```swift
if max(a, b) < c {
```
```swift
switch (lhs, rhs) {
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
if (condition) {
```
```swift
if(condition) {
```
```swift
if (condition == endIndex) {
```
```swift
if ((a || b) && (c || d)) {
```
```swift
if ((min...max).contains(value)) {
```
```swift
for (item in collection) {
```
```swift
for (var index = 0; index < 42; index++) {
```
```swift
for(item in collection) {
```
```swift
for(var index = 0; index < 42; index++) {
```
```swift
guard (condition) else {
```
```swift
while (condition) {
```
```swift
while(condition) {
```
```swift
} while (condition) {
```
```swift
} while(condition) {
```
```swift
do { ; } while(condition) {
```
```swift
do { ; } while (condition) {
```
```swift
switch (foo) {
```
```swift
do {
} catch(let error as NSError) {
}
```
```swift
if (max(a, b) < c) {
```
</details>
## Convenience Type
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`convenience_type` | Disabled | No | idiomatic | No | 4.1.0
Types used for hosting only static members should be implemented as a caseless enum to avoid instantiation.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
enum Math { // enum
public static let pi = 3.14
}
```
```swift
// class with inheritance
class MathViewController: UIViewController {
public static let pi = 3.14
}
```
```swift
@objc class Math: NSObject { // class visible to Obj-C
public static let pi = 3.14
}
```
```swift
struct Math { // type with non-static declarations
public static let pi = 3.14
public let randomNumber = 2
}
```
```swift
class DummyClass {}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
struct Math {
public static let pi = 3.14
}
```
```swift
class Math {
public static let pi = 3.14
}
```
```swift
struct Math {
public static let pi = 3.14
@available(*, unavailable) init() {}
}
```
</details>
## Custom Rules
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`custom_rules` | Enabled | No | style | No | 3.0.0
Create custom rules by providing a regex string. Optionally specify what syntax kinds to match against, the severity level, and what message to display.
## Cyclomatic Complexity
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`cyclomatic_complexity` | Enabled | No | metrics | No | 3.0.0
Complexity of function bodies should be limited.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
func f1() {
if true {
for _ in 1..5 { } }
if false { }
}
```
```swift
func f(code: Int) -> Int {switch code {
case 0: fallthrough
case 0: return 1
case 0: return 1
case 0: return 1
case 0: return 1
case 0: return 1
case 0: return 1
case 0: return 1
case 0: return 1
default: return 1}}
```
```swift
func f1() {if true {}; if true {}; if true {}; if true {}; if true {}; if true {}
func f2() {
if true {}; if true {}; if true {}; if true {}; if true {}
}}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
func f1() {
if true {
if true {
if false {}
}
}
if false {}
let i = 0
switch i {
case 1: break
case 2: break
case 3: break
case 4: break
default: break
}
for _ in 1...5 {
guard true else {
return
}
}
}
```
</details>
## Discarded Notification Center Observer
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`discarded_notification_center_observer` | Enabled | No | lint | No | 3.0.0
When registering for a notification using a block, the opaque observer that is returned should be stored so it can be removed later.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let foo = nc.addObserver(forName: .NSSystemTimeZoneDidChange, object: nil, queue: nil) { }
```
```swift
let foo = nc.addObserver(forName: .NSSystemTimeZoneDidChange, object: nil, queue: nil, using: { })
```
```swift
func foo() -> Any {
return nc.addObserver(forName: .NSSystemTimeZoneDidChange, object: nil, queue: nil, using: { })
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
nc.addObserver(forName: .NSSystemTimeZoneDidChange, object: nil, queue: nil) { }
```
```swift
nc.addObserver(forName: .NSSystemTimeZoneDidChange, object: nil, queue: nil, using: { })
```
```swift
@discardableResult func foo() -> Any {
return nc.addObserver(forName: .NSSystemTimeZoneDidChange, object: nil, queue: nil, using: { })
}
```
</details>
## Discouraged Direct Initialization
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`discouraged_direct_init` | Enabled | No | lint | No | 3.0.0
Discouraged direct initialization of types that can be harmful.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let foo = UIDevice.current
```
```swift
let foo = Bundle.main
```
```swift
let foo = Bundle(path: "bar")
```
```swift
let foo = Bundle(identifier: "bar")
```
```swift
let foo = Bundle.init(path: "bar")
```
```swift
let foo = Bundle.init(identifier: "bar")
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
UIDevice()
```
```swift
Bundle()
```
```swift
let foo = UIDevice()
```
```swift
let foo = Bundle()
```
```swift
let foo = bar(bundle: Bundle(), device: UIDevice())
```
```swift
UIDevice.init()
```
```swift
Bundle.init()
```
```swift
let foo = UIDevice.init()
```
```swift
let foo = Bundle.init()
```
```swift
let foo = bar(bundle: Bundle.init(), device: UIDevice.init())
```
</details>
## Discouraged Object Literal
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`discouraged_object_literal` | Disabled | No | idiomatic | No | 3.0.0
Prefer initializers over object literals.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let image = UIImage(named: aVariable)
```
```swift
let image = UIImage(named: "interpolated \(variable)")
```
```swift
let color = UIColor(red: value, green: value, blue: value, alpha: 1)
```
```swift
let image = NSImage(named: aVariable)
```
```swift
let image = NSImage(named: "interpolated \(variable)")
```
```swift
let color = NSColor(red: value, green: value, blue: value, alpha: 1)
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
let image = #imageLiteral(resourceName: "image.jpg")
```
```swift
let color = #colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)
```
</details>
## Discouraged Optional Boolean
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`discouraged_optional_boolean` | Disabled | No | idiomatic | No | 3.0.0
Prefer non-optional booleans over optional booleans.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
var foo: Bool
```
```swift
var foo: [String: Bool]
```
```swift
var foo: [Bool]
```
```swift
let foo: Bool = true
```
```swift
let foo: Bool = false
```
```swift
let foo: [String: Bool] = [:]
```
```swift
let foo: [Bool] = []
```
```swift
var foo: Bool { return true }
```
```swift
let foo: Bool { return false }()
```
```swift
func foo() -> Bool {}
```
```swift
func foo() -> [String: Bool] {}
```
```swift
func foo() -> ([Bool]) -> String {}
```
```swift
func foo(input: Bool = true) {}
```
```swift
func foo(input: [String: Bool] = [:]) {}
```
```swift
func foo(input: [Bool] = []) {}
```
```swift
class Foo {
func foo() -> Bool {}
}
```
```swift
class Foo {
func foo() -> [String: Bool] {}
}
```
```swift
class Foo {
func foo() -> ([Bool]) -> String {}
}
```
```swift
struct Foo {
func foo() -> Bool {}
}
```
```swift
struct Foo {
func foo() -> [String: Bool] {}
}
```
```swift
struct Foo {
func foo() -> ([Bool]) -> String {}
}
```
```swift
enum Foo {
func foo() -> Bool {}
}
```
```swift
enum Foo {
func foo() -> [String: Bool] {}
}
```
```swift
enum Foo {
func foo() -> ([Bool]) -> String {}
}
```
```swift
class Foo {
func foo(input: Bool = true) {}
}
```
```swift
class Foo {
func foo(input: [String: Bool] = [:]) {}
}
```
```swift
class Foo {
func foo(input: [Bool] = []) {}
}
```
```swift
struct Foo {
func foo(input: Bool = true) {}
}
```
```swift
struct Foo {
func foo(input: [String: Bool] = [:]) {}
}
```
```swift
struct Foo {
func foo(input: [Bool] = []) {}
}
```
```swift
enum Foo {
func foo(input: Bool = true) {}
}
```
```swift
enum Foo {
func foo(input: [String: Bool] = [:]) {}
}
```
```swift
enum Foo {
func foo(input: [Bool] = []) {}
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
var foo: Bool?
```
```swift
var foo: [String: Bool?]
```
```swift
var foo: [Bool?]
```
```swift
let foo: Bool? = nil
```
```swift
let foo: [String: Bool?] = [:]
```
```swift
let foo: [Bool?] = []
```
```swift
let foo = Optional.some(false)
```
```swift
let foo = Optional.some(true)
```
```swift
var foo: Bool? { return nil }
```
```swift
let foo: Bool? { return nil }()
```
```swift
func foo() -> Bool? {}
```
```swift
func foo() -> [String: Bool?] {}
```
```swift
func foo() -> [Bool?] {}
```
```swift
static func foo() -> Bool? {}
```
```swift
static func foo() -> [String: Bool?] {}
```
```swift
static func foo() -> [Bool?] {}
```
```swift
func foo() -> (Bool?) -> String {}
```
```swift
func foo() -> ([Int]) -> Bool? {}
```
```swift
func foo(input: Bool?) {}
```
```swift
func foo(input: [String: Bool?]) {}
```
```swift
func foo(input: [Bool?]) {}
```
```swift
static func foo(input: Bool?) {}
```
```swift
static func foo(input: [String: Bool?]) {}
```
```swift
static func foo(input: [Bool?]) {}
```
```swift
class Foo {
var foo: Bool?
}
```
```swift
class Foo {
var foo: [String: Bool?]
}
```
```swift
class Foo {
let foo: Bool? = nil
}
```
```swift
class Foo {
let foo: [String: Bool?] = [:]
}
```
```swift
class Foo {
let foo: [Bool?] = []
}
```
```swift
struct Foo {
var foo: Bool?
}
```
```swift
struct Foo {
var foo: [String: Bool?]
}
```
```swift
struct Foo {
let foo: Bool? = nil
}
```
```swift
struct Foo {
let foo: [String: Bool?] = [:]
}
```
```swift
struct Foo {
let foo: [Bool?] = []
}
```
```swift
class Foo {
var foo: Bool? { return nil }
}
```
```swift
class Foo {
let foo: Bool? { return nil }()
}
```
```swift
struct Foo {
var foo: Bool? { return nil }
}
```
```swift
struct Foo {
let foo: Bool? { return nil }()
}
```
```swift
enum Foo {
var foo: Bool? { return nil }
}
```
```swift
enum Foo {
let foo: Bool? { return nil }()
}
```
```swift
class Foo {
func foo() -> Bool? {}
}
```
```swift
class Foo {
func foo() -> [String: Bool?] {}
}
```
```swift
class Foo {
func foo() -> [Bool?] {}
}
```
```swift
class Foo {
static func foo() -> Bool? {}
}
```
```swift
class Foo {
static func foo() -> [String: Bool?] {}
}
```
```swift
class Foo {
static func foo() -> [Bool?] {}
}
```
```swift
class Foo {
func foo() -> (Bool?) -> String {}
}
```
```swift
class Foo {
func foo() -> ([Int]) -> Bool? {}
}
```
```swift
struct Foo {
func foo() -> Bool? {}
}
```
```swift
struct Foo {
func foo() -> [String: Bool?] {}
}
```
```swift
struct Foo {
func foo() -> [Bool?] {}
}
```
```swift
struct Foo {
static func foo() -> Bool? {}
}
```
```swift
struct Foo {
static func foo() -> [String: Bool?] {}
}
```
```swift
struct Foo {
static func foo() -> [Bool?] {}
}
```
```swift
struct Foo {
func foo() -> (Bool?) -> String {}
}
```
```swift
struct Foo {
func foo() -> ([Int]) -> Bool? {}
}
```
```swift
enum Foo {
func foo() -> Bool? {}
}
```
```swift
enum Foo {
func foo() -> [String: Bool?] {}
}
```
```swift
enum Foo {
func foo() -> [Bool?] {}
}
```
```swift
enum Foo {
static func foo() -> Bool? {}
}
```
```swift
enum Foo {
static func foo() -> [String: Bool?] {}
}
```
```swift
enum Foo {
static func foo() -> [Bool?] {}
}
```
```swift
enum Foo {
func foo() -> (Bool?) -> String {}
}
```
```swift
enum Foo {
func foo() -> ([Int]) -> Bool? {}
}
```
```swift
class Foo {
func foo(input: Bool?) {}
}
```
```swift
class Foo {
func foo(input: [String: Bool?]) {}
}
```
```swift
class Foo {
func foo(input: [Bool?]) {}
}
```
```swift
class Foo {
static func foo(input: Bool?) {}
}
```
```swift
class Foo {
static func foo(input: [String: Bool?]) {}
}
```
```swift
class Foo {
static func foo(input: [Bool?]) {}
}
```
```swift
struct Foo {
func foo(input: Bool?) {}
}
```
```swift
struct Foo {
func foo(input: [String: Bool?]) {}
}
```
```swift
struct Foo {
func foo(input: [Bool?]) {}
}
```
```swift
struct Foo {
static func foo(input: Bool?) {}
}
```
```swift
struct Foo {
static func foo(input: [String: Bool?]) {}
}
```
```swift
struct Foo {
static func foo(input: [Bool?]) {}
}
```
```swift
enum Foo {
func foo(input: Bool?) {}
}
```
```swift
enum Foo {
func foo(input: [String: Bool?]) {}
}
```
```swift
enum Foo {
func foo(input: [Bool?]) {}
}
```
```swift
enum Foo {
static func foo(input: Bool?) {}
}
```
```swift
enum Foo {
static func foo(input: [String: Bool?]) {}
}
```
```swift
enum Foo {
static func foo(input: [Bool?]) {}
}
```
</details>
## Discouraged Optional Collection
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`discouraged_optional_collection` | Disabled | No | idiomatic | No | 3.0.0
Prefer empty collection over optional collection.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
var foo: [Int]
```
```swift
var foo: [String: Int]
```
```swift
var foo: Set<String>
```
```swift
var foo: [String: [String: Int]]
```
```swift
let foo: [Int] = []
```
```swift
let foo: [String: Int] = [:]
```
```swift
let foo: Set<String> = []
```
```swift
let foo: [String: [String: Int]] = [:]
```
```swift
var foo: [Int] { return [] }
```
```swift
func foo() -> [Int] {}
```
```swift
func foo() -> [String: String] {}
```
```swift
func foo() -> Set<Int> {}
```
```swift
func foo() -> ([Int]) -> String {}
```
```swift
func foo(input: [String] = []) {}
```
```swift
func foo(input: [String: String] = [:]) {}
```
```swift
func foo(input: Set<String> = []) {}
```
```swift
class Foo {
func foo() -> [Int] {}
}
```
```swift
class Foo {
func foo() -> [String: String] {}
}
```
```swift
class Foo {
func foo() -> Set<Int> {}
}
```
```swift
class Foo {
func foo() -> ([Int]) -> String {}
}
```
```swift
struct Foo {
func foo() -> [Int] {}
}
```
```swift
struct Foo {
func foo() -> [String: String] {}
}
```
```swift
struct Foo {
func foo() -> Set<Int> {}
}
```
```swift
struct Foo {
func foo() -> ([Int]) -> String {}
}
```
```swift
enum Foo {
func foo() -> [Int] {}
}
```
```swift
enum Foo {
func foo() -> [String: String] {}
}
```
```swift
enum Foo {
func foo() -> Set<Int> {}
}
```
```swift
enum Foo {
func foo() -> ([Int]) -> String {}
}
```
```swift
class Foo {
func foo(input: [String] = []) {}
}
```
```swift
class Foo {
func foo(input: [String: String] = [:]) {}
}
```
```swift
class Foo {
func foo(input: Set<String> = []) {}
}
```
```swift
struct Foo {
func foo(input: [String] = []) {}
}
```
```swift
struct Foo {
func foo(input: [String: String] = [:]) {}
}
```
```swift
struct Foo {
func foo(input: Set<String> = []) {}
}
```
```swift
enum Foo {
func foo(input: [String] = []) {}
}
```
```swift
enum Foo {
func foo(input: [String: String] = [:]) {}
}
```
```swift
enum Foo {
func foo(input: Set<String> = []) {}
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
var foo: [Int]?
```
```swift
var foo: [String: Int]?
```
```swift
var foo: Set<String>?
```
```swift
let foo: [Int]? = nil
```
```swift
let foo: [String: Int]? = nil
```
```swift
let foo: Set<String>? = nil
```
```swift
var foo: [Int]? { return nil }
```
```swift
let foo: [Int]? { return nil }()
```
```swift
func foo() -> [T]? {}
```
```swift
func foo() -> [String: String]? {}
```
```swift
func foo() -> [String: [String: String]]? {}
```
```swift
func foo() -> [String: [String: String]?] {}
```
```swift
func foo() -> Set<Int>? {}
```
```swift
static func foo() -> [T]? {}
```
```swift
static func foo() -> [String: String]? {}
```
```swift
static func foo() -> [String: [String: String]]? {}
```
```swift
static func foo() -> [String: [String: String]?] {}
```
```swift
static func foo() -> Set<Int>? {}
```
```swift
func foo() -> ([Int]?) -> String {}
```
```swift
func foo() -> ([Int]) -> [String]? {}
```
```swift
func foo(input: [String: String]?) {}
```
```swift
func foo(input: [String: [String: String]]?) {}
```
```swift
func foo(input: [String: [String: String]?]) {}
```
```swift
func foo(↓↓input: [String: [String: String]?]?) {}
```
```swift
func foo<K, V>(_ dict1: [K: V], _ dict2: [K: V]?) -> [K: V]
```
```swift
func foo<K, V>(dict1: [K: V], dict2: [K: V]?) -> [K: V]
```
```swift
static func foo(input: [String: String]?) {}
```
```swift
static func foo(input: [String: [String: String]]?) {}
```
```swift
static func foo(input: [String: [String: String]?]) {}
```
```swift
static func foo(↓↓input: [String: [String: String]?]?) {}
```
```swift
static func foo<K, V>(_ dict1: [K: V], _ dict2: [K: V]?) -> [K: V]
```
```swift
static func foo<K, V>(dict1: [K: V], dict2: [K: V]?) -> [K: V]
```
```swift
class Foo {
var foo: [Int]?
}
```
```swift
class Foo {
var foo: [String: Int]?
}
```
```swift
class Foo {
var foo: Set<String>?
}
```
```swift
class Foo {
let foo: [Int]? = nil
}
```
```swift
class Foo {
let foo: [String: Int]? = nil
}
```
```swift
class Foo {
let foo: Set<String>? = nil
}
```
```swift
struct Foo {
var foo: [Int]?
}
```
```swift
struct Foo {
var foo: [String: Int]?
}
```
```swift
struct Foo {
var foo: Set<String>?
}
```
```swift
struct Foo {
let foo: [Int]? = nil
}
```
```swift
struct Foo {
let foo: [String: Int]? = nil
}
```
```swift
struct Foo {
let foo: Set<String>? = nil
}
```
```swift
class Foo {
var foo: [Int]? { return nil }
}
```
```swift
class Foo {
let foo: [Int]? { return nil }()
}
```
```swift
class Foo {
var foo: Set<String>? { return nil }
}
```
```swift
class Foo {
let foo: Set<String>? { return nil }()
}
```
```swift
struct Foo {
var foo: [Int]? { return nil }
}
```
```swift
struct Foo {
let foo: [Int]? { return nil }()
}
```
```swift
struct Foo {
var foo: Set<String>? { return nil }
}
```
```swift
struct Foo {
let foo: Set<String>? { return nil }()
}
```
```swift
enum Foo {
var foo: [Int]? { return nil }
}
```
```swift
enum Foo {
let foo: [Int]? { return nil }()
}
```
```swift
enum Foo {
var foo: Set<String>? { return nil }
}
```
```swift
enum Foo {
let foo: Set<String>? { return nil }()
}
```
```swift
class Foo {
func foo() -> [T]? {}
}
```
```swift
class Foo {
func foo() -> [String: String]? {}
}
```
```swift
class Foo {
func foo() -> [String: [String: String]]? {}
}
```
```swift
class Foo {
func foo() -> [String: [String: String]?] {}
}
```
```swift
class Foo {
func foo() -> Set<Int>? {}
}
```
```swift
class Foo {
static func foo() -> [T]? {}
}
```
```swift
class Foo {
static func foo() -> [String: String]? {}
}
```
```swift
class Foo {
static func foo() -> [String: [String: String]]? {}
}
```
```swift
class Foo {
static func foo() -> [String: [String: String]?] {}
}
```
```swift
class Foo {
static func foo() -> Set<Int>? {}
}
```
```swift
class Foo {
func foo() -> ([Int]?) -> String {}
}
```
```swift
class Foo {
func foo() -> ([Int]) -> [String]? {}
}
```
```swift
struct Foo {
func foo() -> [T]? {}
}
```
```swift
struct Foo {
func foo() -> [String: String]? {}
}
```
```swift
struct Foo {
func foo() -> [String: [String: String]]? {}
}
```
```swift
struct Foo {
func foo() -> [String: [String: String]?] {}
}
```
```swift
struct Foo {
func foo() -> Set<Int>? {}
}
```
```swift
struct Foo {
static func foo() -> [T]? {}
}
```
```swift
struct Foo {
static func foo() -> [String: String]? {}
}
```
```swift
struct Foo {
static func foo() -> [String: [String: String]]? {}
}
```
```swift
struct Foo {
static func foo() -> [String: [String: String]?] {}
}
```
```swift
struct Foo {
static func foo() -> Set<Int>? {}
}
```
```swift
struct Foo {
func foo() -> ([Int]?) -> String {}
}
```
```swift
struct Foo {
func foo() -> ([Int]) -> [String]? {}
}
```
```swift
enum Foo {
func foo() -> [T]? {}
}
```
```swift
enum Foo {
func foo() -> [String: String]? {}
}
```
```swift
enum Foo {
func foo() -> [String: [String: String]]? {}
}
```
```swift
enum Foo {
func foo() -> [String: [String: String]?] {}
}
```
```swift
enum Foo {
func foo() -> Set<Int>? {}
}
```
```swift
enum Foo {
static func foo() -> [T]? {}
}
```
```swift
enum Foo {
static func foo() -> [String: String]? {}
}
```
```swift
enum Foo {
static func foo() -> [String: [String: String]]? {}
}
```
```swift
enum Foo {
static func foo() -> [String: [String: String]?] {}
}
```
```swift
enum Foo {
static func foo() -> Set<Int>? {}
}
```
```swift
enum Foo {
func foo() -> ([Int]?) -> String {}
}
```
```swift
enum Foo {
func foo() -> ([Int]) -> [String]? {}
}
```
```swift
class Foo {
func foo(input: [String: String]?) {}
}
```
```swift
class Foo {
func foo(input: [String: [String: String]]?) {}
}
```
```swift
class Foo {
func foo(input: [String: [String: String]?]) {}
}
```
```swift
class Foo {
func foo(↓↓input: [String: [String: String]?]?) {}
}
```
```swift
class Foo {
func foo<K, V>(_ dict1: [K: V], _ dict2: [K: V]?) -> [K: V]
}
```
```swift
class Foo {
func foo<K, V>(dict1: [K: V], dict2: [K: V]?) -> [K: V]
}
```
```swift
class Foo {
static func foo(input: [String: String]?) {}
}
```
```swift
class Foo {
static func foo(input: [String: [String: String]]?) {}
}
```
```swift
class Foo {
static func foo(input: [String: [String: String]?]) {}
}
```
```swift
class Foo {
static func foo(↓↓input: [String: [String: String]?]?) {}
}
```
```swift
class Foo {
static func foo<K, V>(_ dict1: [K: V], _ dict2: [K: V]?) -> [K: V]
}
```
```swift
class Foo {
static func foo<K, V>(dict1: [K: V], dict2: [K: V]?) -> [K: V]
}
```
```swift
struct Foo {
func foo(input: [String: String]?) {}
}
```
```swift
struct Foo {
func foo(input: [String: [String: String]]?) {}
}
```
```swift
struct Foo {
func foo(input: [String: [String: String]?]) {}
}
```
```swift
struct Foo {
func foo(↓↓input: [String: [String: String]?]?) {}
}
```
```swift
struct Foo {
func foo<K, V>(_ dict1: [K: V], _ dict2: [K: V]?) -> [K: V]
}
```
```swift
struct Foo {
func foo<K, V>(dict1: [K: V], dict2: [K: V]?) -> [K: V]
}
```
```swift
struct Foo {
static func foo(input: [String: String]?) {}
}
```
```swift
struct Foo {
static func foo(input: [String: [String: String]]?) {}
}
```
```swift
struct Foo {
static func foo(input: [String: [String: String]?]) {}
}
```
```swift
struct Foo {
static func foo(↓↓input: [String: [String: String]?]?) {}
}
```
```swift
struct Foo {
static func foo<K, V>(_ dict1: [K: V], _ dict2: [K: V]?) -> [K: V]
}
```
```swift
struct Foo {
static func foo<K, V>(dict1: [K: V], dict2: [K: V]?) -> [K: V]
}
```
```swift
enum Foo {
func foo(input: [String: String]?) {}
}
```
```swift
enum Foo {
func foo(input: [String: [String: String]]?) {}
}
```
```swift
enum Foo {
func foo(input: [String: [String: String]?]) {}
}
```
```swift
enum Foo {
func foo(↓↓input: [String: [String: String]?]?) {}
}
```
```swift
enum Foo {
func foo<K, V>(_ dict1: [K: V], _ dict2: [K: V]?) -> [K: V]
}
```
```swift
enum Foo {
func foo<K, V>(dict1: [K: V], dict2: [K: V]?) -> [K: V]
}
```
```swift
enum Foo {
static func foo(input: [String: String]?) {}
}
```
```swift
enum Foo {
static func foo(input: [String: [String: String]]?) {}
}
```
```swift
enum Foo {
static func foo(input: [String: [String: String]?]) {}
}
```
```swift
enum Foo {
static func foo(↓↓input: [String: [String: String]?]?) {}
}
```
```swift
enum Foo {
static func foo<K, V>(_ dict1: [K: V], _ dict2: [K: V]?) -> [K: V]
}
```
```swift
enum Foo {
static func foo<K, V>(dict1: [K: V], dict2: [K: V]?) -> [K: V]
}
```
</details>
## Dynamic Inline
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`dynamic_inline` | Enabled | No | lint | No | 3.0.0
Avoid using 'dynamic' and '@inline(__always)' together.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
class C {
dynamic func f() {}}
```
```swift
class C {
@inline(__always) func f() {}}
```
```swift
class C {
@inline(never) dynamic func f() {}}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
class C {
@inline(__always) dynamic func f() {}
}
```
```swift
class C {
@inline(__always) public dynamic func f() {}
}
```
```swift
class C {
@inline(__always) dynamic internal func f() {}
}
```
```swift
class C {
@inline(__always)
dynamic func f() {}
}
```
```swift
class C {
@inline(__always)
dynamic
func f() {}
}
```
</details>
## Empty Count
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`empty_count` | Disabled | No | performance | No | 3.0.0
Prefer checking `isEmpty` over comparing `count` to zero.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
var count = 0
```
```swift
[Int]().isEmpty
```
```swift
[Int]().count > 1
```
```swift
[Int]().count == 1
```
```swift
discount == 0
```
```swift
order.discount == 0
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
[Int]().count == 0
```
```swift
[Int]().count > 0
```
```swift
[Int]().count != 0
```
```swift
count == 0
```
</details>
## Empty Enum Arguments
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`empty_enum_arguments` | Enabled | Yes | style | No | 3.0.0
Arguments can be omitted when matching enums with associated types if they are not used.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
switch foo {
case .bar: break
}
```
```swift
switch foo {
case .bar(let x): break
}
```
```swift
switch foo {
case let .bar(x): break
}
```
```swift
switch (foo, bar) {
case (_, _): break
}
```
```swift
switch foo {
case "bar".uppercased(): break
}
```
```swift
switch (foo, bar) {
case (_, _) where !something: break
}
```
```swift
switch foo {
case (let f as () -> String)?: break
}
```
```swift
switch foo {
default: break
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
switch foo {
case .bar(_): break
}
```
```swift
switch foo {
case .bar(): break
}
```
```swift
switch foo {
case .bar(_), .bar2(_): break
}
```
```swift
switch foo {
case .bar() where method() > 2: break
}
```
```swift
func example(foo: Foo) {
switch foo {
case case .bar(_):
break
}
}
```
</details>
## Empty Parameters
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`empty_parameters` | Enabled | Yes | style | No | 3.0.0
Prefer `() -> ` over `Void -> `.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let abc: () -> Void = {}
```
```swift
func foo(completion: () -> Void)
```
```swift
func foo(completion: () thows -> Void)
```
```swift
let foo: (ConfigurationTests) -> Void throws -> Void)
```
```swift
let foo: (ConfigurationTests) -> Void throws -> Void)
```
```swift
let foo: (ConfigurationTests) ->Void throws -> Void)
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
let abc: (Void) -> Void = {}
```
```swift
func foo(completion: (Void) -> Void)
```
```swift
func foo(completion: (Void) throws -> Void)
```
```swift
let foo: (Void) -> () throws -> Void)
```
</details>
## Empty Parentheses with Trailing Closure
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`empty_parentheses_with_trailing_closure` | Enabled | Yes | style | No | 3.0.0
When using trailing closures, empty parentheses should be avoided after the method call.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
[1, 2].map { $0 + 1 }
```
```swift
[1, 2].map({ $0 + 1 })
```
```swift
[1, 2].reduce(0) { $0 + $1 }
```
```swift
[1, 2].map { number in
number + 1
}
```
```swift
let isEmpty = [1, 2].isEmpty()
```
```swift
UIView.animateWithDuration(0.3, animations: {
self.disableInteractionRightView.alpha = 0
}, completion: { _ in
()
})
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
[1, 2].map() { $0 + 1 }
```
```swift
[1, 2].map( ) { $0 + 1 }
```
```swift
[1, 2].map() { number in
number + 1
}
```
```swift
[1, 2].map( ) { number in
number + 1
}
```
```swift
func foo() -> [Int] {
return [1, 2].map() { $0 + 1 }
}
```
</details>
## Empty String
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`empty_string` | Disabled | No | performance | No | 3.0.0
Prefer checking `isEmpty` over comparing `string` to an empty string literal.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
myString.isEmpty
```
```swift
!myString.isEmpy
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
myString == ""
```
```swift
myString != ""
```
</details>
## Empty XCTest Method
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`empty_xctest_method` | Disabled | No | lint | No | 3.0.0
Empty XCTest method should be avoided.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
class TotoTests: XCTestCase {
var foobar: Foobar?
override func setUp() {
super.setUp()
foobar = Foobar()
}
override func tearDown() {
foobar = nil
super.tearDown()
}
func testFoo() {
XCTAssertTrue(foobar?.foo)
}
func testBar() {
// comment...
XCTAssertFalse(foobar?.bar)
// comment...
}
}
```
```swift
class Foobar {
func setUp() {}
func tearDown() {}
func testFoo() {}
}
```
```swift
class TotoTests: XCTestCase {
func setUp(with object: Foobar) {}
func tearDown(object: Foobar) {}
func testFoo(_ foo: Foobar) {}
func testBar(bar: (String) -> Int) {}
}
```
```swift
class TotoTests: XCTestCase {
func testFoo() { XCTAssertTrue(foobar?.foo) }
func testBar() { XCTAssertFalse(foobar?.bar) }
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
class TotoTests: XCTestCase {
override func setUp() {
}
override func tearDown() {
}
func testFoo() {
}
func testBar() {
}
func helperFunction() {
}
}
```
```swift
class TotoTests: XCTestCase {
override func setUp() {}
override func tearDown() {}
func testFoo() {}
func helperFunction() {}
}
```
```swift
class TotoTests: XCTestCase {
override func setUp() {
// comment...
}
override func tearDown() {
// comment...
// comment...
}
func testFoo() {
// comment...
// comment...
// comment...
}
func testBar() {
/*
* comment...
*
* comment...
*
* comment...
*/
}
func helperFunction() {
}
}
```
```swift
class FooTests: XCTestCase {
override func setUp() {}
}
class BarTests: XCTestCase {
func testFoo() {}
}
```
</details>
## Explicit ACL
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`explicit_acl` | Disabled | No | idiomatic | No | 3.0.0
All declarations should specify Access Control Level keywords explicitly.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
internal enum A {}
```
```swift
public final class B {}
```
```swift
private struct C {}
```
```swift
internal enum A {
internal enum B {}
}
```
```swift
internal final class Foo {}
```
```swift
internal
class Foo { private let bar = 5 }
```
```swift
internal func a() { let a = }
```
```swift
private func a() { func innerFunction() { } }
```
```swift
private enum Foo { enum Bar { } }
```
```swift
private struct C { let d = 5 }
```
```swift
internal protocol A {
func b()
}
```
```swift
internal protocol A {
var b: Int
}
```
```swift
internal class A { deinit {} }
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
enum A {}
```
```swift
final class B {}
```
```swift
internal struct C { let d = 5 }
```
```swift
public struct C { let d = 5 }
```
```swift
func a() {}
```
```swift
internal let a = 0
func b() {}
```
</details>
## Explicit Enum Raw Value
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`explicit_enum_raw_value` | Disabled | No | idiomatic | No | 3.0.0
Enums should be explicitly assigned their raw values.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
enum Numbers {
case int(Int)
case short(Int16)
}
```
```swift
enum Numbers: Int {
case one = 1
case two = 2
}
```
```swift
enum Numbers: Double {
case one = 1.1
case two = 2.2
}
```
```swift
enum Numbers: String {
case one = "one"
case two = "two"
}
```
```swift
protocol Algebra {}
enum Numbers: Algebra {
case one
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
enum Numbers: Int {
case one = 10, two, three = 30
}
```
```swift
enum Numbers: NSInteger {
case one
}
```
```swift
enum Numbers: String {
case one
case two
}
```
```swift
enum Numbers: String {
case one, two = "two"
}
```
```swift
enum Numbers: Decimal {
case one, two
}
```
</details>
## Explicit Init
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`explicit_init` | Disabled | Yes | idiomatic | No | 3.0.0
Explicitly calling .init() should be avoided.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
import Foundation; class C: NSObject { override init() { super.init() }}
```
```swift
struct S { let n: Int }; extension S { init() { self.init(n: 1) } }
```
```swift
[1].flatMap(String.init)
```
```swift
[String.self].map { $0.init(1) }
```
```swift
[String.self].map { type in type.init(1) }
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
[1].flatMap{String.init($0)}
```
```swift
[String.self].map { Type in Type.init(1) }
```
```swift
func foo() -> [String] {
return [1].flatMap { String.init($0) }
}
```
</details>
## Explicit Self
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`explicit_self` | Disabled | Yes | style | Yes | 3.0.0
Instance variables and functions should be explicitly accessed with 'self.'.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
struct A {
func f1() {}
func f2() {
self.f1()
}
}
```
```swift
struct A {
let p1: Int
func f1() {
_ = self.p1
}
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
struct A {
func f1() {}
func f2() {
f1()
}
}
```
```swift
struct A {
let p1: Int
func f1() {
_ = p1
}
}
```
</details>
## Explicit Top Level ACL
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`explicit_top_level_acl` | Disabled | No | idiomatic | No | 3.0.0
Top-level declarations should specify Access Control Level keywords explicitly.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
internal enum A {}
```
```swift
public final class B {}
```
```swift
private struct C {}
```
```swift
internal enum A {
enum B {}
}
```
```swift
internal final class Foo {}
```
```swift
internal
class Foo {}
```
```swift
internal func a() {}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
enum A {}
```
```swift
final class B {}
```
```swift
struct C {}
```
```swift
func a() {}
```
```swift
internal let a = 0
func b() {}
```
</details>
## Explicit Type Interface
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`explicit_type_interface` | Disabled | No | idiomatic | No | 3.0.0
Properties should have a type interface
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
class Foo {
var myVar: Int? = 0
}
```
```swift
class Foo {
let myVar: Int? = 0
}
```
```swift
class Foo {
static var myVar: Int? = 0
}
```
```swift
class Foo {
class var myVar: Int? = 0
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
class Foo {
var myVar = 0
}
```
```swift
class Foo {
let mylet = 0
}
```
```swift
class Foo {
static var myStaticVar = 0
}
```
```swift
class Foo {
class var myClassVar = 0
}
```
```swift
class Foo {
let myVar = Int(0)
}
```
```swift
class Foo {
let myVar = Set<Int>(0)
}
```
</details>
## Extension Access Modifier
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`extension_access_modifier` | Disabled | No | idiomatic | No | 3.0.0
Prefer to use extension access modifiers
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
extension Foo: SomeProtocol {
public var bar: Int { return 1 }
}
```
```swift
extension Foo {
private var bar: Int { return 1 }
public var baz: Int { return 1 }
}
```
```swift
extension Foo {
private var bar: Int { return 1 }
public func baz() {}
}
```
```swift
extension Foo {
var bar: Int { return 1 }
var baz: Int { return 1 }
}
```
```swift
public extension Foo {
var bar: Int { return 1 }
var baz: Int { return 1 }
}
```
```swift
extension Foo {
private bar: Int { return 1 }
private baz: Int { return 1 }
}
```
```swift
extension Foo {
open bar: Int { return 1 }
open baz: Int { return 1 }
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
extension Foo {
public var bar: Int { return 1 }
public var baz: Int { return 1 }
}
```
```swift
extension Foo {
public var bar: Int { return 1 }
public func baz() {}
}
```
```swift
public extension Foo {
public func bar() {}
public func baz() {}
}
```
</details>
## Fallthrough
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`fallthrough` | Disabled | No | idiomatic | No | 3.0.0
Fallthrough should be avoided.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
switch foo {
case .bar, .bar2, .bar3:
something()
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
switch foo {
case .bar:
fallthrough
case .bar2:
something()
}
```
</details>
## Fatal Error Message
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`fatal_error_message` | Disabled | No | idiomatic | No | 3.0.0
A fatalError call should have a message.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
func foo() {
fatalError("Foo")
}
```
```swift
func foo() {
fatalError(x)
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
func foo() {
fatalError("")
}
```
```swift
func foo() {
fatalError()
}
```
</details>
## File Header
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`file_header` | Disabled | No | style | No | 3.0.0
Header comments should be consistent with project patterns. The SWIFTLINT_CURRENT_FILENAME placeholder can optionally be used in the required and forbidden patterns. It will be replaced by the real file name.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let foo = "Copyright"
```
```swift
let foo = 2 // Copyright
```
```swift
let foo = 2
// Copyright
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
// ↓Copyright
```
```swift
//
// ↓Copyright
```
```swift
//
// FileHeaderRule.swift
// SwiftLint
//
// Created by Marcelo Fabri on 27/11/16.
// ↓Copyright © 2016 Realm. All rights reserved.
//
```
</details>
## File Line Length
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`file_length` | Enabled | No | metrics | No | 3.0.0
Files should not span too many lines.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
```
```swift
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
print("swiftlint")
//
```
</details>
## File Name
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`file_name` | Disabled | No | idiomatic | No | 3.0.0
File name should match a type or extension declared in the file (if any).
## First Where
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`first_where` | Disabled | No | performance | No | 3.0.0
Prefer using `.first(where:)` over `.filter { }.first` in collections.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
kinds.filter(excludingKinds.contains).isEmpty && kinds.first == .identifier
```
```swift
myList.first(where: { $0 % 2 == 0 })
```
```swift
match(pattern: pattern).filter { $0.first == .identifier }
```
```swift
(myList.filter { $0 == 1 }.suffix(2)).first
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
myList.filter { $0 % 2 == 0 }.first
```
```swift
myList.filter({ $0 % 2 == 0 }).first
```
```swift
myList.map { $0 + 1 }.filter({ $0 % 2 == 0 }).first
```
```swift
myList.map { $0 + 1 }.filter({ $0 % 2 == 0 }).first?.something()
```
```swift
myList.filter(someFunction).first
```
```swift
myList.filter({ $0 % 2 == 0 })
.first
```
```swift
(myList.filter { $0 == 1 }).first
```
</details>
## For Where
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`for_where` | Enabled | No | idiomatic | No | 3.0.0
`where` clauses are preferred over a single `if` inside a `for`.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
for user in users where user.id == 1 { }
```
```swift
for user in users {
if let id = user.id { }
}
```
```swift
for user in users {
if var id = user.id { }
}
```
```swift
for user in users {
if user.id == 1 { } else { }
}
```
```swift
for user in users {
if user.id == 1 {
} else if user.id == 2 { }
}
```
```swift
for user in users {
if user.id == 1 { }
print(user)
}
```
```swift
for user in users {
let id = user.id
if id == 1 { }
}
```
```swift
for user in users {
if user.id == 1 { }
return true
}
```
```swift
for user in users {
if user.id == 1 && user.age > 18 { }
}
```
```swift
for (index, value) in array.enumerated() {
if case .valueB(_) = value {
return index
}
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
for user in users {
if user.id == 1 { return true }
}
```
</details>
## Force Cast
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`force_cast` | Enabled | No | idiomatic | No | 3.0.0
Force casts should be avoided.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
NSNumber() as? Int
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
NSNumber() as! Int
```
</details>
## Force Try
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`force_try` | Enabled | No | idiomatic | No | 3.0.0
Force tries should be avoided.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
func a() throws {}; do { try a() } catch {}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
func a() throws {}; try! a()
```
</details>
## Force Unwrapping
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`force_unwrapping` | Disabled | No | idiomatic | No | 3.0.0
Force unwrapping should be avoided.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
if let url = NSURL(string: query)
```
```swift
navigationController?.pushViewController(viewController, animated: true)
```
```swift
let s as! Test
```
```swift
try! canThrowErrors()
```
```swift
let object: Any!
```
```swift
@IBOutlet var constraints: [NSLayoutConstraint]!
```
```swift
setEditing(!editing, animated: true)
```
```swift
navigationController.setNavigationBarHidden(!navigationController.navigationBarHidden, animated: true)
```
```swift
if addedToPlaylist && (!self.selectedFilters.isEmpty || self.searchBar?.text?.isEmpty == false) {}
```
```swift
print("\(xVar)!")
```
```swift
var test = (!bar)
```
```swift
var a: [Int]!
```
```swift
private var myProperty: (Void -> Void)!
```
```swift
func foo(_ options: [AnyHashable: Any]!) {
```
```swift
func foo() -> [Int]!
```
```swift
func foo() -> [AnyHashable: Any]!
```
```swift
func foo() -> [Int]! { return [] }
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
let url = NSURL(string: query)!
```
```swift
navigationController!.pushViewController(viewController, animated: true)
```
```swift
let unwrapped = optional!
```
```swift
return cell!
```
```swift
let url = NSURL(string: "http://www.google.com")!
```
```swift
let dict = ["Boooo": "👻"]func bla() -> String { return dict["Boooo"]! }
```
```swift
let dict = ["Boooo": "👻"]func bla() -> String { return dict["Boooo"]!.contains("B") }
```
```swift
let a = dict["abc"]!.contains("B")
```
```swift
dict["abc"]!.bar("B")
```
```swift
if dict["a"]!!!! {
```
```swift
var foo: [Bool]! = dict["abc"]!
```
```swift
context("abc") {
var foo: [Bool]! = dict["abc"]!
}
```
```swift
open var computed: String { return foo.bar! }
```
</details>
## Function Body Length
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`function_body_length` | Enabled | No | metrics | No | 3.0.0
Functions bodies should not span too many lines.
## Function Default Parameter at End
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`function_default_parameter_at_end` | Disabled | No | idiomatic | No | 3.0.0
Prefer to locate parameters with defaults toward the end of the parameter list.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
func foo(baz: String, bar: Int = 0) {}
```
```swift
func foo(x: String, y: Int = 0, z: CGFloat = 0) {}
```
```swift
func foo(bar: String, baz: Int = 0, z: () -> Void) {}
```
```swift
func foo(bar: String, z: () -> Void, baz: Int = 0) {}
```
```swift
func foo(bar: Int = 0) {}
```
```swift
func foo() {}
```
```swift
class A: B {
override func foo(bar: Int = 0, baz: String) {}
```
```swift
func foo(bar: Int = 0, completion: @escaping CompletionHandler) {}
```
```swift
func foo(a: Int, b: CGFloat = 0) {
let block = { (error: Error?) in }
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
func foo(bar: Int = 0, baz: String) {}
```
</details>
## Function Parameter Count
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`function_parameter_count` | Enabled | No | metrics | No | 3.0.0
Number of function parameters should be low.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
init(a: Int, b: Int, c: Int, d: Int, e: Int, f: Int) {}
```
```swift
init (a: Int, b: Int, c: Int, d: Int, e: Int, f: Int) {}
```
```swift
`init`(a: Int, b: Int, c: Int, d: Int, e: Int, f: Int) {}
```
```swift
init?(a: Int, b: Int, c: Int, d: Int, e: Int, f: Int) {}
```
```swift
init?<T>(a: T, b: Int, c: Int, d: Int, e: Int, f: Int) {}
```
```swift
init?<T: String>(a: T, b: Int, c: Int, d: Int, e: Int, f: Int) {}
```
```swift
func f2(p1: Int, p2: Int) { }
```
```swift
func f(a: Int, b: Int, c: Int, d: Int, x: Int = 42) {}
```
```swift
func f(a: [Int], b: Int, c: Int, d: Int, f: Int) -> [Int] {
let s = a.flatMap { $0 as? [String: Int] } ?? []}}
```
```swift
override func f(a: Int, b: Int, c: Int, d: Int, e: Int, f: Int) {}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
func f(a: Int, b: Int, c: Int, d: Int, e: Int, f: Int) {}
```
```swift
func initialValue(a: Int, b: Int, c: Int, d: Int, e: Int, f: Int) {}
```
```swift
func f(a: Int, b: Int, c: Int, d: Int, e: Int, f: Int = 2, g: Int) {}
```
```swift
struct Foo {
init(a: Int, b: Int, c: Int, d: Int, e: Int, f: Int) {}
func bar(a: Int, b: Int, c: Int, d: Int, e: Int, f: Int) {}}
```
</details>
## Generic Type Name
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`generic_type_name` | Enabled | No | idiomatic | No | 3.0.0
Generic type name should only contain alphanumeric characters, start with an uppercase character and span between 1 and 20 characters in length.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
func foo<T>() {}
```
```swift
func foo<T>() -> T {}
```
```swift
func foo<T, U>(param: U) -> T {}
```
```swift
func foo<T: Hashable, U: Rule>(param: U) -> T {}
```
```swift
struct Foo<T> {}
```
```swift
class Foo<T> {}
```
```swift
enum Foo<T> {}
```
```swift
func run(_ options: NoOptions<CommandantError<()>>) {}
```
```swift
func foo(_ options: Set<type>) {}
```
```swift
func < <T: Comparable>(lhs: T?, rhs: T?) -> Bool
```
```swift
func configureWith(data: Either<MessageThread, (project: Project, backing: Backing)>)
```
```swift
typealias StringDictionary<T> = Dictionary<String, T>
```
```swift
typealias BackwardTriple<T1, T2, T3> = (T3, T2, T1)
```
```swift
typealias DictionaryOfStrings<T : Hashable> = Dictionary<T, String>
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
func foo<T_Foo>() {}
```
```swift
func foo<T, U_Foo>(param: U_Foo) -> T {}
```
```swift
func foo<TTTTTTTTTTTTTTTTTTTTT>() {}
```
```swift
func foo<type>() {}
```
```swift
typealias StringDictionary<T_Foo> = Dictionary<String, T_Foo>
```
```swift
typealias BackwardTriple<T1, T2_Bar, T3> = (T3, T2_Bar, T1)
```
```swift
typealias DictionaryOfStrings<T_Foo: Hashable> = Dictionary<T_Foo, String>
```
```swift
class Foo<T_Foo> {}
```
```swift
class Foo<T, U_Foo> {}
```
```swift
class Foo<T_Foo, U_Foo> {}
```
```swift
class Foo<TTTTTTTTTTTTTTTTTTTTT> {}
```
```swift
class Foo<type> {}
```
```swift
struct Foo<T_Foo> {}
```
```swift
struct Foo<T, U_Foo> {}
```
```swift
struct Foo<T_Foo, U_Foo> {}
```
```swift
struct Foo<TTTTTTTTTTTTTTTTTTTTT> {}
```
```swift
struct Foo<type> {}
```
```swift
enum Foo<T_Foo> {}
```
```swift
enum Foo<T, U_Foo> {}
```
```swift
enum Foo<T_Foo, U_Foo> {}
```
```swift
enum Foo<TTTTTTTTTTTTTTTTTTTTT> {}
```
```swift
enum Foo<type> {}
```
</details>
## Identifier Name
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`identifier_name` | Enabled | No | style | No | 3.0.0
Identifier names should only contain alphanumeric characters and start with a lowercase character or should only contain capital letters. In an exception to the above, variable names may start with a capital letter when they are declared static and immutable. Variable names should not be too long or too short.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let myLet = 0
```
```swift
var myVar = 0
```
```swift
private let _myLet = 0
```
```swift
class Abc { static let MyLet = 0 }
```
```swift
let URL: NSURL? = nil
```
```swift
let XMLString: String? = nil
```
```swift
override var i = 0
```
```swift
enum Foo { case myEnum }
```
```swift
func isOperator(name: String) -> Bool
```
```swift
func typeForKind(_ kind: SwiftDeclarationKind) -> String
```
```swift
func == (lhs: SyntaxToken, rhs: SyntaxToken) -> Bool
```
```swift
override func IsOperator(name: String) -> Bool
```
```swift
enum Foo { case `private` }
```
```swift
enum Foo { case value(String) }
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
let MyLet = 0
```
```swift
let _myLet = 0
```
```swift
private let myLet_ = 0
```
```swift
let myExtremelyVeryVeryVeryVeryVeryVeryLongLet = 0
```
```swift
var myExtremelyVeryVeryVeryVeryVeryVeryLongVar = 0
```
```swift
private let _myExtremelyVeryVeryVeryVeryVeryVeryLongLet = 0
```
```swift
let i = 0
```
```swift
var id = 0
```
```swift
private let _i = 0
```
```swift
func IsOperator(name: String) -> Bool
```
```swift
enum Foo { case MyEnum }
```
</details>
## Implicit Getter
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`implicit_getter` | Enabled | No | style | No | 3.0.0
Computed read-only properties and subscripts should avoid using the get keyword.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
class Foo {
var foo: Int {
get { return 3 }
set { _abc = newValue }
}
}
```
```swift
class Foo {
var foo: Int {
return 20
}
}
```
```swift
class Foo {
static var foo: Int {
return 20
}
}
```
```swift
class Foo {
static var foo: Int {
get { return 3 }
set { _abc = newValue }
}
}
```
```swift
class Foo {
var foo: Int
}
```
```swift
class Foo {
var foo: Int {
return getValueFromDisk()
}
}
```
```swift
class Foo {
var foo: String {
return "get"
}
}
```
```swift
protocol Foo {
var foo: Int { get }
```
```swift
protocol Foo {
var foo: Int { get set }
```
```swift
class Foo {
var foo: Int {
struct Bar {
var bar: Int {
get { return 1 }
set { _ = newValue }
}
}
return Bar().bar
}
}
```
```swift
var _objCTaggedPointerBits: UInt {
@inline(__always) get { return 0 }
}
```
```swift
var next: Int? {
mutating get {
defer { self.count += 1 }
return self.count
}
}
```
```swift
class Foo {
subscript(i: Int) -> Int {
return 20
}
}
```
```swift
class Foo {
subscript(i: Int) -> Int {
get { return 3 }
set { _abc = newValue }
}
}
```
```swift
protocol Foo {
subscript(i: Int) -> Int { get }
}
```
```swift
protocol Foo {
subscript(i: Int) -> Int { get set }
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
class Foo {
var foo: Int {
get {
return 20
}
}
}
```
```swift
class Foo {
var foo: Int {
get{ return 20 }
}
}
```
```swift
class Foo {
static var foo: Int {
get {
return 20
}
}
}
```
```swift
var foo: Int {
get { return 20 }
}
```
```swift
class Foo {
@objc func bar() {}
var foo: Int {
get {
return 20
}
}
}
```
```swift
class Foo {
subscript(i: Int) -> Int {
get {
return 20
}
}
}
```
</details>
## Implicit Return
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`implicit_return` | Disabled | Yes | style | No | 3.0.0
Prefer implicit returns in closures.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
foo.map { $0 + 1 }
```
```swift
foo.map({ $0 + 1 })
```
```swift
foo.map { value in value + 1 }
```
```swift
func foo() -> Int {
return 0
}
```
```swift
if foo {
return 0
}
```
```swift
var foo: Bool { return true }
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
foo.map { value in
return value + 1
}
```
```swift
foo.map {
return $0 + 1
}
```
```swift
foo.map({ return $0 + 1})
```
```swift
[1, 2].first(where: {
return true
})
```
</details>
## Implicitly Unwrapped Optional
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`implicitly_unwrapped_optional` | Disabled | No | idiomatic | No | 3.0.0
Implicitly unwrapped optionals should be avoided when possible.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
@IBOutlet private var label: UILabel!
```
```swift
@IBOutlet var label: UILabel!
```
```swift
@IBOutlet var label: [UILabel!]
```
```swift
if !boolean {}
```
```swift
let int: Int? = 42
```
```swift
let int: Int? = nil
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
let label: UILabel!
```
```swift
let IBOutlet: UILabel!
```
```swift
let labels: [UILabel!]
```
```swift
var ints: [Int!] = [42, nil, 42]
```
```swift
let label: IBOutlet!
```
```swift
let int: Int! = 42
```
```swift
let int: Int! = nil
```
```swift
var int: Int! = 42
```
```swift
let int: ImplicitlyUnwrappedOptional<Int>
```
```swift
let collection: AnyCollection<Int!>
```
```swift
func foo(int: Int!) {}
```
</details>
## Inert Defer
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`inert_defer` | Enabled | No | lint | No | 3.0.0
If defer is at the end of its parent scope, it will be executed right where it is anyway.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
func example3() {
defer { /* deferred code */ }
print("other code")
}
```
```swift
func example4() {
if condition {
defer { /* deferred code */ }
print("other code")
}
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
func example0() {
defer { /* deferred code */ }
}
```
```swift
func example1() {
defer { /* deferred code */ }
// comment
}
```
```swift
func example2() {
if condition {
defer { /* deferred code */ }
// comment
}
}
```
</details>
## Is Disjoint
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`is_disjoint` | Enabled | No | idiomatic | No | 3.0.0
Prefer using `Set.isDisjoint(with:)` over `Set.intersection(_:).isEmpty`.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
_ = Set(syntaxKinds).isDisjoint(with: commentAndStringKindsSet)
```
```swift
let isObjc = !objcAttributes.isDisjoint(with: dictionary.enclosedSwiftAttributes)
```
```swift
_ = Set(syntaxKinds).intersection(commentAndStringKindsSet)
```
```swift
_ = !objcAttributes.intersection(dictionary.enclosedSwiftAttributes)
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
_ = Set(syntaxKinds).intersection(commentAndStringKindsSet).isEmpty
```
```swift
let isObjc = !objcAttributes.intersection(dictionary.enclosedSwiftAttributes).isEmpty
```
</details>
## Joined Default Parameter
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`joined_default_parameter` | Disabled | Yes | idiomatic | No | 3.0.0
Discouraged explicit usage of the default separator.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let foo = bar.joined()
```
```swift
let foo = bar.joined(separator: ",")
```
```swift
let foo = bar.joined(separator: toto)
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
let foo = bar.joined(separator: "")
```
```swift
let foo = bar.filter(toto)
.joined(separator: "")
```
```swift
func foo() -> String {
return ["1", "2"].joined(separator: "")
}
```
</details>
## Large Tuple
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`large_tuple` | Enabled | No | metrics | No | 3.0.0
Tuples shouldn't have too many members. Create a custom type instead.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let foo: (Int, Int)
```
```swift
let foo: (start: Int, end: Int)
```
```swift
let foo: (Int, (Int, String))
```
```swift
func foo() -> (Int, Int)
```
```swift
func foo() -> (Int, Int) {}
```
```swift
func foo(bar: String) -> (Int, Int)
```
```swift
func foo(bar: String) -> (Int, Int) {}
```
```swift
func foo() throws -> (Int, Int)
```
```swift
func foo() throws -> (Int, Int) {}
```
```swift
let foo: (Int, Int, Int) -> Void
```
```swift
let foo: (Int, Int, Int) throws -> Void
```
```swift
func foo(bar: (Int, String, Float) -> Void)
```
```swift
func foo(bar: (Int, String, Float) throws -> Void)
```
```swift
var completionHandler: ((_ data: Data?, _ resp: URLResponse?, _ e: NSError?) -> Void)!
```
```swift
func getDictionaryAndInt() -> (Dictionary<Int, String>, Int)?
```
```swift
func getGenericTypeAndInt() -> (Type<Int, String, Float>, Int)?
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
let foo: (Int, Int, Int)
```
```swift
let foo: (start: Int, end: Int, value: String)
```
```swift
let foo: (Int, (Int, Int, Int))
```
```swift
func foo(bar: (Int, Int, Int))
```
```swift
func foo() -> (Int, Int, Int)
```
```swift
func foo() -> (Int, Int, Int) {}
```
```swift
func foo(bar: String) -> (Int, Int, Int)
```
```swift
func foo(bar: String) -> (Int, Int, Int) {}
```
```swift
func foo() throws -> (Int, Int, Int)
```
```swift
func foo() throws -> (Int, Int, Int) {}
```
```swift
func foo() throws -> (Int, (String, String, String), Int) {}
```
```swift
func getDictionaryAndInt() -> (Dictionary<Int, (String, String, String)>, Int)?
```
</details>
## Leading Whitespace
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`leading_whitespace` | Enabled | Yes | style | No | 3.0.0
Files should not contain leading whitespace.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
//
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
```
```swift
//
```
</details>
## Legacy CGGeometry Functions
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`legacy_cggeometry_functions` | Enabled | Yes | idiomatic | No | 3.0.0
Struct extension properties and methods are preferred over legacy functions
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
rect.width
```
```swift
rect.height
```
```swift
rect.minX
```
```swift
rect.midX
```
```swift
rect.maxX
```
```swift
rect.minY
```
```swift
rect.midY
```
```swift
rect.maxY
```
```swift
rect.isNull
```
```swift
rect.isEmpty
```
```swift
rect.isInfinite
```
```swift
rect.standardized
```
```swift
rect.integral
```
```swift
rect.insetBy(dx: 5.0, dy: -7.0)
```
```swift
rect.offsetBy(dx: 5.0, dy: -7.0)
```
```swift
rect1.union(rect2)
```
```swift
rect1.intersect(rect2)
```
```swift
rect1.contains(rect2)
```
```swift
rect.contains(point)
```
```swift
rect1.intersects(rect2)
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
CGRectGetWidth(rect)
```
```swift
CGRectGetHeight(rect)
```
```swift
CGRectGetMinX(rect)
```
```swift
CGRectGetMidX(rect)
```
```swift
CGRectGetMaxX(rect)
```
```swift
CGRectGetMinY(rect)
```
```swift
CGRectGetMidY(rect)
```
```swift
CGRectGetMaxY(rect)
```
```swift
CGRectIsNull(rect)
```
```swift
CGRectIsEmpty(rect)
```
```swift
CGRectIsInfinite(rect)
```
```swift
CGRectStandardize(rect)
```
```swift
CGRectIntegral(rect)
```
```swift
CGRectInset(rect, 10, 5)
```
```swift
CGRectOffset(rect, -2, 8.3)
```
```swift
CGRectUnion(rect1, rect2)
```
```swift
CGRectIntersection(rect1, rect2)
```
```swift
CGRectContainsRect(rect1, rect2)
```
```swift
CGRectContainsPoint(rect, point)
```
```swift
CGRectIntersectsRect(rect1, rect2)
```
</details>
## Legacy Constant
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`legacy_constant` | Enabled | Yes | idiomatic | No | 3.0.0
Struct-scoped constants are preferred over legacy global constants.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
CGRect.infinite
```
```swift
CGPoint.zero
```
```swift
CGRect.zero
```
```swift
CGSize.zero
```
```swift
NSPoint.zero
```
```swift
NSRect.zero
```
```swift
NSSize.zero
```
```swift
CGRect.null
```
```swift
CGFloat.pi
```
```swift
Float.pi
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
CGRectInfinite
```
```swift
CGPointZero
```
```swift
CGRectZero
```
```swift
CGSizeZero
```
```swift
NSZeroPoint
```
```swift
NSZeroRect
```
```swift
NSZeroSize
```
```swift
CGRectNull
```
```swift
CGFloat(M_PI)
```
```swift
Float(M_PI)
```
</details>
## Legacy Constructor
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`legacy_constructor` | Enabled | Yes | idiomatic | No | 3.0.0
Swift constructors are preferred over legacy convenience functions.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
CGPoint(x: 10, y: 10)
```
```swift
CGPoint(x: xValue, y: yValue)
```
```swift
CGSize(width: 10, height: 10)
```
```swift
CGSize(width: aWidth, height: aHeight)
```
```swift
CGRect(x: 0, y: 0, width: 10, height: 10)
```
```swift
CGRect(x: xVal, y: yVal, width: aWidth, height: aHeight)
```
```swift
CGVector(dx: 10, dy: 10)
```
```swift
CGVector(dx: deltaX, dy: deltaY)
```
```swift
NSPoint(x: 10, y: 10)
```
```swift
NSPoint(x: xValue, y: yValue)
```
```swift
NSSize(width: 10, height: 10)
```
```swift
NSSize(width: aWidth, height: aHeight)
```
```swift
NSRect(x: 0, y: 0, width: 10, height: 10)
```
```swift
NSRect(x: xVal, y: yVal, width: aWidth, height: aHeight)
```
```swift
NSRange(location: 10, length: 1)
```
```swift
NSRange(location: loc, length: len)
```
```swift
UIEdgeInsets(top: 0, left: 0, bottom: 10, right: 10)
```
```swift
UIEdgeInsets(top: aTop, left: aLeft, bottom: aBottom, right: aRight)
```
```swift
NSEdgeInsets(top: 0, left: 0, bottom: 10, right: 10)
```
```swift
NSEdgeInsets(top: aTop, left: aLeft, bottom: aBottom, right: aRight)
```
```swift
UIOffset(horizontal: 0, vertical: 10)
```
```swift
UIOffset(horizontal: horizontal, vertical: vertical)
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
CGPointMake(10, 10)
```
```swift
CGPointMake(xVal, yVal)
```
```swift
CGPointMake(calculateX(), 10)
```
```swift
CGSizeMake(10, 10)
```
```swift
CGSizeMake(aWidth, aHeight)
```
```swift
CGRectMake(0, 0, 10, 10)
```
```swift
CGRectMake(xVal, yVal, width, height)
```
```swift
CGVectorMake(10, 10)
```
```swift
CGVectorMake(deltaX, deltaY)
```
```swift
NSMakePoint(10, 10)
```
```swift
NSMakePoint(xVal, yVal)
```
```swift
NSMakeSize(10, 10)
```
```swift
NSMakeSize(aWidth, aHeight)
```
```swift
NSMakeRect(0, 0, 10, 10)
```
```swift
NSMakeRect(xVal, yVal, width, height)
```
```swift
NSMakeRange(10, 1)
```
```swift
NSMakeRange(loc, len)
```
```swift
UIEdgeInsetsMake(0, 0, 10, 10)
```
```swift
UIEdgeInsetsMake(top, left, bottom, right)
```
```swift
NSEdgeInsetsMake(0, 0, 10, 10)
```
```swift
NSEdgeInsetsMake(top, left, bottom, right)
```
```swift
CGVectorMake(10, 10)
NSMakeRange(10, 1)
```
```swift
UIOffsetMake(0, 10)
```
```swift
UIOffsetMake(horizontal, vertical)
```
</details>
## Legacy NSGeometry Functions
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`legacy_nsgeometry_functions` | Enabled | Yes | idiomatic | No | 3.0.0
Struct extension properties and methods are preferred over legacy functions
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
rect.width
```
```swift
rect.height
```
```swift
rect.minX
```
```swift
rect.midX
```
```swift
rect.maxX
```
```swift
rect.minY
```
```swift
rect.midY
```
```swift
rect.maxY
```
```swift
rect.isEmpty
```
```swift
rect.integral
```
```swift
rect.insetBy(dx: 5.0, dy: -7.0)
```
```swift
rect.offsetBy(dx: 5.0, dy: -7.0)
```
```swift
rect1.union(rect2)
```
```swift
rect1.intersect(rect2)
```
```swift
rect1.contains(rect2)
```
```swift
rect.contains(point)
```
```swift
rect1.intersects(rect2)
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
NSWidth(rect)
```
```swift
NSHeight(rect)
```
```swift
NSMinX(rect)
```
```swift
NSMidX(rect)
```
```swift
NSMaxX(rect)
```
```swift
NSMinY(rect)
```
```swift
NSMidY(rect)
```
```swift
NSMaxY(rect)
```
```swift
NSEqualRects(rect1, rect2)
```
```swift
NSEqualSizes(size1, size2)
```
```swift
NSEqualPoints(point1, point2)
```
```swift
NSEdgeInsetsEqual(insets2, insets2)
```
```swift
NSIsEmptyRect(rect)
```
```swift
NSIntegralRect(rect)
```
```swift
NSInsetRect(rect, 10, 5)
```
```swift
NSOffsetRect(rect, -2, 8.3)
```
```swift
NSUnionRect(rect1, rect2)
```
```swift
NSIntersectionRect(rect1, rect2)
```
```swift
NSContainsRect(rect1, rect2)
```
```swift
NSPointInRect(rect, point)
```
```swift
NSIntersectsRect(rect1, rect2)
```
</details>
## Variable Declaration Whitespace
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`let_var_whitespace` | Disabled | No | style | No | 3.0.0
Let and var should be separated from other statements by a blank line.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let a = 0
var x = 1
x = 2
```
```swift
a = 5
var x = 1
```
```swift
struct X {
var a = 0
}
```
```swift
let a = 1 +
2
let b = 5
```
```swift
var x: Int {
return 0
}
```
```swift
var x: Int {
let a = 0
return a
}
```
```swift
#if os(macOS)
let a = 0
#endif
```
```swift
@available(swift 4)
let a = 0
```
```swift
class C {
@objc
var s: String = ""
}
```
```swift
class C {
@objc
func a() {}
}
```
```swift
class C {
var x = 0
lazy
var y = 0
}
```
```swift
@available(OSX, introduced: 10.6)
@available(*, deprecated)
var x = 0
```
```swift
// swiftlint:disable superfluous_disable_command
// swiftlint:disable force_cast
let x = bar as! Bar
```
```swift
var x: Int {
let a = 0
return a
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
var x = 1
x = 2
```
```swift
a = 5
var x = 1
```
```swift
struct X {
let a
func x() {}
}
```
```swift
var x = 0
@objc func f() {}
```
```swift
var x = 0
@objc
func f() {}
```
```swift
@objc func f() {
}
var x = 0
```
</details>
## Line Length
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`line_length` | Enabled | No | metrics | No | 3.0.0
Lines should not span too many characters.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
```
```swift
#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)
```
```swift
#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
```
```swift
#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)#colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)
```
```swift
#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")#imageLiteral(resourceName: "image.jpg")
```
</details>
## Literal Expression End Indentation
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`literal_expression_end_indentation` | Disabled | Yes | style | No | 3.0.0
Array and dictionary literal end should have the same indentation as the line that started it.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
[1, 2, 3]
```
```swift
[1,
2
]
```
```swift
[
1,
2
]
```
```swift
[
1,
2]
```
```swift
let x = [
1,
2
]
```
```swift
[key: 2, key2: 3]
```
```swift
[key: 1,
key2: 2
]
```
```swift
[
key: 0,
key2: 20
]
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
let x = [
1,
2
]
```
```swift
let x = [
1,
2
]
```
```swift
let x = [
key: value
]
```
</details>
## Lower ACL than parent
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`lower_acl_than_parent` | Disabled | No | lint | No | 3.0.0
Ensure definitions have a lower access control level than their enclosing parent
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
public struct Foo { public func bar() {} }
```
```swift
internal struct Foo { func bar() {} }
```
```swift
struct Foo { func bar() {} }
```
```swift
open class Foo { public func bar() {} }
```
```swift
open class Foo { open func bar() {} }
```
```swift
fileprivate struct Foo { private func bar() {} }
```
```swift
private struct Foo { private func bar(id: String) }
```
```swift
extension Foo { public func bar() {} }
```
```swift
private struct Foo { fileprivate func bar() {} }
```
```swift
private func foo(id: String) {}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
struct Foo { public func bar() {} }
```
```swift
enum Foo { public func bar() {} }
```
```swift
public class Foo { open func bar() }
```
```swift
class Foo { public private(set) var bar: String? }
```
</details>
## Mark
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`mark` | Enabled | Yes | lint | No | 3.0.0
MARK comment should be in valid format. e.g. '// MARK: ...' or '// MARK: - ...'
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
// MARK: good
```
```swift
// MARK: - good
```
```swift
// MARK: -
```
```swift
// BOOKMARK
```
```swift
//BOOKMARK
```
```swift
// BOOKMARKS
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
//MARK: bad
```
```swift
// MARK:bad
```
```swift
//MARK:bad
```
```swift
// MARK: bad
```
```swift
// MARK: bad
```
```swift
// MARK: -bad
```
```swift
// MARK:- bad
```
```swift
// MARK:-bad
```
```swift
//MARK: - bad
```
```swift
//MARK:- bad
```
```swift
//MARK: -bad
```
```swift
//MARK:-bad
```
```swift
//Mark: bad
```
```swift
// Mark: bad
```
```swift
// MARK bad
```
```swift
//MARK bad
```
```swift
// MARK - bad
```
```swift
//MARK : bad
```
```swift
// MARKL:
```
```swift
// MARKR
```
```swift
// MARKK -
```
```swift
//MARK:- Top-Level bad mark
//MARK:- Another bad mark
struct MarkTest {}
// MARK:- Bad mark
extension MarkTest {}
```
</details>
## Missing Docs
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`missing_docs` | Disabled | No | lint | No | 4.1.0
Declarations should be documented.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
/// docs
public class A {
/// docs
public func b() {}
}
/// docs
public class B: A { override public func b() {} }
```
```swift
import Foundation
/// docs
public class B: NSObject {
// no docs
override public var description: String { fatalError() } }
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
public func a() {}
```
```swift
// regular comment
public func a() {}
```
```swift
/* regular comment */
public func a() {}
```
```swift
/// docs
public protocol A {
// no docs
var b: Int { get } }
/// docs
public struct C: A {
public let b: Int
}
```
</details>
## Modifier Order
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`modifier_order` | Disabled | No | style | No | 4.1.0
Modifier order should be consistent.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
public class Foo {
public convenience required init() {}
}
```
```swift
public class Foo {
public static let bar = 42
}
```
```swift
public class Foo {
public static var bar: Int {
return 42 }}
```
```swift
public class Foo {
public class var bar: Int {
return 42
}
}
```
```swift
public class Bar {
public class var foo: String {
return "foo"
}
}
public class Foo: Bar {
override public final class var foo: String {
return "bar"
}
}
```
```swift
open class Bar {
public var foo: Int? {
return 42
}
}
open class Foo: Bar {
override public var foo: Int? {
return 43
}
}
```
```swift
open class Bar {
open class func foo() -> Int {
return 42
}
}
class Foo: Bar {
override open class func foo() -> Int {
return 43
}
}
```
```swift
protocol Foo: class {}
class Bar {
public private(set) weak var foo: Foo?
}
```
```swift
@objc
public final class Foo: NSObject {}
```
```swift
@objcMembers
public final class Foo: NSObject {}
```
```swift
@objc
override public private(set) weak var foo: Bar?
```
```swift
@objc
public final class Foo: NSObject {}
```
```swift
@objc
open final class Foo: NSObject {
open weak var weakBar: NSString? = nil
}
```
```swift
public final class Foo {}
```
```swift
class Bar {
func bar() {}
}
```
```swift
internal class Foo: Bar {
override internal func bar() {}
}
```
```swift
public struct Foo {
internal weak var weakBar: NSObject? = nil
}
```
```swift
class Foo {
internal lazy var bar: String = "foo"
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
class Foo {
convenience required public init() {}
}
```
```swift
public class Foo {
static public let bar = 42
}
```
```swift
public class Foo {
static public var bar: Int {
return 42
}
}
```
```swift
public class Foo {
class public var bar: Int {
return 42
}
}
```
```swift
public class RootFoo {
class public var foo: String {
return "foo"
}
}
public class Foo: RootFoo {
override final class public var foo: String {
return "bar"
}
}
```
```swift
open class Bar {
public var foo: Int? {
return 42
}
}
open class Foo: Bar {
public override var foo: Int? {
return 43
}
}
```
```swift
protocol Foo: class {}
class Bar {
private(set) public weak var foo: Foo?
}
```
```swift
open class Bar {
open class func foo() -> Int {
return 42
}
}
class Foo: Bar {
class open override func foo() -> Int {
return 43
}
}
```
```swift
open class Bar {
open class func foo() -> Int {
return 42
}
}
class Foo: Bar {
open override class func foo() -> Int {
return 43
}
}
```
```swift
@objc
final public class Foo: NSObject {}
```
```swift
@objcMembers
final public class Foo: NSObject {}
```
```swift
@objc
final open class Foo: NSObject {
weak open var weakBar: NSString? = nil
}
```
```swift
final public class Foo {}
```
```swift
internal class Foo: Bar {
internal override func bar() {}
}
```
```swift
public struct Foo {
weak internal var weakBar: NSObjetc? = nil
}
```
```swift
class Foo {
lazy internal var bar: String = "foo"
}
```
</details>
## Multiline Arguments
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`multiline_arguments` | Disabled | No | style | No | 3.0.0
Arguments should be either on the same line, or one per line.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
foo()
```
```swift
foo(
)
```
```swift
foo { }
```
```swift
foo {
}
```
```swift
foo(0)
```
```swift
foo(0, 1)
```
```swift
foo(0, 1) { }
```
```swift
foo(0, param1: 1)
```
```swift
foo(0, param1: 1) { }
```
```swift
foo(param1: 1)
```
```swift
foo(param1: 1) { }
```
```swift
foo(param1: 1, param2: true) { }
```
```swift
foo(param1: 1, param2: true, param3: [3]) { }
```
```swift
foo(param1: 1, param2: true, param3: [3]) {
bar()
}
```
```swift
foo(param1: 1,
param2: true,
param3: [3])
```
```swift
foo(
param1: 1, param2: true, param3: [3]
)
```
```swift
foo(
param1: 1,
param2: true,
param3: [3]
)
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
foo(0,
param1: 1, param2: true, param3: [3])
```
```swift
foo(0, param1: 1,
param2: true, param3: [3])
```
```swift
foo(0, param1: 1, param2: true,
param3: [3])
```
```swift
foo(
0, param1: 1,
param2: true, param3: [3]
)
```
</details>
## Multiline Function Chains
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`multiline_function_chains` | Disabled | No | style | No | 3.0.0
Chained function calls should be either on the same line, or one per line.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let evenSquaresSum = [20, 17, 35, 4].filter { $0 % 2 == 0 }.map { $0 * $0 }.reduce(0, +)
```
```swift
let evenSquaresSum = [20, 17, 35, 4]
.filter { $0 % 2 == 0 }.map { $0 * $0 }.reduce(0, +)",
```
```swift
let chain = a
.b(1, 2, 3)
.c { blah in
print(blah)
}
.d()
```
```swift
let chain = a.b(1, 2, 3)
.c { blah in
print(blah)
}
.d()
```
```swift
let chain = a.b(1, 2, 3)
.c { blah in print(blah) }
.d()
```
```swift
let chain = a.b(1, 2, 3)
.c(.init(
a: 1,
b, 2,
c, 3))
.d()
```
```swift
self.viewModel.outputs.postContextualNotification
.observeForUI()
.observeValues {
NotificationCenter.default.post(
Notification(
name: .ksr_showNotificationsDialog,
userInfo: [UserInfoKeys.context: PushNotificationDialog.Context.pledge,
UserInfoKeys.viewController: self]
)
)
}
```
```swift
let remainingIDs = Array(Set(self.currentIDs).subtracting(Set(response.ids)))
```
```swift
self.happeningNewsletterOn = self.updateCurrentUser
.map { $0.newsletters.happening }.skipNil().skipRepeats()
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
let evenSquaresSum = [20, 17, 35, 4]
.filter { $0 % 2 == 0 }.map { $0 * $0 }
.reduce(0, +)
```
```swift
let evenSquaresSum = a.b(1, 2, 3)
.c { blah in
print(blah)
}.d()
```
```swift
let evenSquaresSum = a.b(1, 2, 3)
.c(2, 3, 4).d()
```
```swift
let evenSquaresSum = a.b(1, 2, 3).c { blah in
print(blah)
}
.d()
```
```swift
a.b {
// ““
}.e()
```
</details>
## Multiline Parameters
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`multiline_parameters` | Disabled | No | style | No | 3.0.0
Functions and methods parameters should be either on the same line, or one per line.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
func foo() { }
```
```swift
func foo(param1: Int) { }
```
```swift
func foo(param1: Int, param2: Bool) { }
```
```swift
func foo(param1: Int, param2: Bool, param3: [String]) { }
```
```swift
func foo(param1: Int,
param2: Bool,
param3: [String]) { }
```
```swift
func foo(_ param1: Int, param2: Int, param3: Int) -> (Int) -> Int {
return { x in x + param1 + param2 + param3 }
}
```
```swift
static func foo() { }
```
```swift
static func foo(param1: Int) { }
```
```swift
static func foo(param1: Int, param2: Bool) { }
```
```swift
static func foo(param1: Int, param2: Bool, param3: [String]) { }
```
```swift
static func foo(param1: Int,
param2: Bool,
param3: [String]) { }
```
```swift
protocol Foo {
func foo() { }
}
```
```swift
protocol Foo {
func foo(param1: Int) { }
}
```
```swift
protocol Foo {
func foo(param1: Int, param2: Bool) { }
}
```
```swift
protocol Foo {
func foo(param1: Int, param2: Bool, param3: [String]) { }
}
```
```swift
protocol Foo {
func foo(param1: Int,
param2: Bool,
param3: [String]) { }
}
```
```swift
protocol Foo {
static func foo(param1: Int, param2: Bool, param3: [String]) { }
}
```
```swift
protocol Foo {
static func foo(param1: Int,
param2: Bool,
param3: [String]) { }
}
```
```swift
protocol Foo {
class func foo(param1: Int, param2: Bool, param3: [String]) { }
}
```
```swift
protocol Foo {
class func foo(param1: Int,
param2: Bool,
param3: [String]) { }
}
```
```swift
enum Foo {
func foo() { }
}
```
```swift
enum Foo {
func foo(param1: Int) { }
}
```
```swift
enum Foo {
func foo(param1: Int, param2: Bool) { }
}
```
```swift
enum Foo {
func foo(param1: Int, param2: Bool, param3: [String]) { }
}
```
```swift
enum Foo {
func foo(param1: Int,
param2: Bool,
param3: [String]) { }
}
```
```swift
enum Foo {
static func foo(param1: Int, param2: Bool, param3: [String]) { }
}
```
```swift
enum Foo {
static func foo(param1: Int,
param2: Bool,
param3: [String]) { }
}
```
```swift
struct Foo {
func foo() { }
}
```
```swift
struct Foo {
func foo(param1: Int) { }
}
```
```swift
struct Foo {
func foo(param1: Int, param2: Bool) { }
}
```
```swift
struct Foo {
func foo(param1: Int, param2: Bool, param3: [String]) { }
}
```
```swift
struct Foo {
func foo(param1: Int,
param2: Bool,
param3: [String]) { }
}
```
```swift
struct Foo {
static func foo(param1: Int, param2: Bool, param3: [String]) { }
}
```
```swift
struct Foo {
static func foo(param1: Int,
param2: Bool,
param3: [String]) { }
}
```
```swift
class Foo {
func foo() { }
}
```
```swift
class Foo {
func foo(param1: Int) { }
}
```
```swift
class Foo {
func foo(param1: Int, param2: Bool) { }
}
```
```swift
class Foo {
func foo(param1: Int, param2: Bool, param3: [String]) { }
}
```
```swift
class Foo {
func foo(param1: Int,
param2: Bool,
param3: [String]) { }
}
```
```swift
class Foo {
class func foo(param1: Int, param2: Bool, param3: [String]) { }
}
```
```swift
class Foo {
class func foo(param1: Int,
param2: Bool,
param3: [String]) { }
}
```
```swift
class Foo {
class func foo(param1: Int,
param2: Bool,
param3: @escaping (Int, Int) -> Void = { _, _ in }) { }
}
```
```swift
class Foo {
class func foo(param1: Int,
param2: Bool,
param3: @escaping (Int) -> Void = { _ in }) { }
}
```
```swift
class Foo {
class func foo(param1: Int,
param2: Bool,
param3: @escaping ((Int) -> Void)? = nil) { }
}
```
```swift
class Foo {
class func foo(param1: Int,
param2: Bool,
param3: @escaping ((Int) -> Void)? = { _ in }) { }
}
```
```swift
class Foo {
class func foo(param1: Int,
param2: @escaping ((Int) -> Void)? = { _ in },
param3: Bool) { }
}
```
```swift
class Foo {
class func foo(param1: Int,
param2: @escaping ((Int) -> Void)? = { _ in },
param3: @escaping (Int, Int) -> Void = { _, _ in }) { }
}
```
```swift
class Foo {
class func foo(param1: Int,
param2: Bool,
param3: @escaping (Int) -> Void = { (x: Int) in }) { }
}
```
```swift
class Foo {
class func foo(param1: Int,
param2: Bool,
param3: @escaping (Int, (Int) -> Void) -> Void = { (x: Int, f: (Int) -> Void) in }) { }
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
func foo(_ param1: Int,
param2: Int, param3: Int) -> (Int) -> Int {
return { x in x + param1 + param2 + param3 }
}
```
```swift
protocol Foo {
func foo(param1: Int,
param2: Bool, param3: [String]) { }
}
```
```swift
protocol Foo {
func foo(param1: Int, param2: Bool,
param3: [String]) { }
}
```
```swift
protocol Foo {
static func foo(param1: Int,
param2: Bool, param3: [String]) { }
}
```
```swift
protocol Foo {
static func foo(param1: Int, param2: Bool,
param3: [String]) { }
}
```
```swift
protocol Foo {
class func foo(param1: Int,
param2: Bool, param3: [String]) { }
}
```
```swift
protocol Foo {
class func foo(param1: Int, param2: Bool,
param3: [String]) { }
}
```
```swift
enum Foo {
func foo(param1: Int,
param2: Bool, param3: [String]) { }
}
```
```swift
enum Foo {
func foo(param1: Int, param2: Bool,
param3: [String]) { }
}
```
```swift
enum Foo {
static func foo(param1: Int,
param2: Bool, param3: [String]) { }
}
```
```swift
enum Foo {
static func foo(param1: Int, param2: Bool,
param3: [String]) { }
}
```
```swift
struct Foo {
func foo(param1: Int,
param2: Bool, param3: [String]) { }
}
```
```swift
struct Foo {
func foo(param1: Int, param2: Bool,
param3: [String]) { }
}
```
```swift
struct Foo {
static func foo(param1: Int,
param2: Bool, param3: [String]) { }
}
```
```swift
struct Foo {
static func foo(param1: Int, param2: Bool,
param3: [String]) { }
}
```
```swift
class Foo {
func foo(param1: Int,
param2: Bool, param3: [String]) { }
}
```
```swift
class Foo {
func foo(param1: Int, param2: Bool,
param3: [String]) { }
}
```
```swift
class Foo {
class func foo(param1: Int,
param2: Bool, param3: [String]) { }
}
```
```swift
class Foo {
class func foo(param1: Int, param2: Bool,
param3: [String]) { }
}
```
```swift
class Foo {
class func foo(param1: Int,
param2: Bool, param3: @escaping (Int, Int) -> Void = { _, _ in }) { }
}
```
```swift
class Foo {
class func foo(param1: Int,
param2: Bool, param3: @escaping (Int) -> Void = { (x: Int) in }) { }
}
```
</details>
## Multiple Closures with Trailing Closure
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`multiple_closures_with_trailing_closure` | Enabled | No | style | No | 3.0.0
Trailing closure syntax should not be used when passing more than one closure argument.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
foo.map { $0 + 1 }
```
```swift
foo.reduce(0) { $0 + $1 }
```
```swift
if let foo = bar.map({ $0 + 1 }) {
}
```
```swift
foo.something(param1: { $0 }, param2: { $0 + 1 })
```
```swift
UIView.animate(withDuration: 1.0) {
someView.alpha = 0.0
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
foo.something(param1: { $0 }) { $0 + 1 }
```
```swift
UIView.animate(withDuration: 1.0, animations: {
someView.alpha = 0.0
}) { _ in
someView.removeFromSuperview()
}
```
</details>
## Nesting
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`nesting` | Enabled | No | metrics | No | 3.0.0
Types should be nested at most 1 level deep, and statements should be nested at most 5 levels deep.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
class Class0 { class Class1 {} }
```
```swift
func func0() {
func func1() {
func func2() {
func func3() {
func func4() { func func5() {
}
}
}
}
}
}
```
```swift
struct Class0 { struct Class1 {} }
```
```swift
func func0() {
func func1() {
func func2() {
func func3() {
func func4() { func func5() {
}
}
}
}
}
}
```
```swift
enum Class0 { enum Class1 {} }
```
```swift
func func0() {
func func1() {
func func2() {
func func3() {
func func4() { func func5() {
}
}
}
}
}
}
```
```swift
enum Enum0 { enum Enum1 { case Case } }
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
class A { class B { class C {} } }
```
```swift
struct A { struct B { struct C {} } }
```
```swift
enum A { enum B { enum C {} } }
```
```swift
func func0() {
func func1() {
func func2() {
func func3() {
func func4() { func func5() {
func func6() {
}
}
}
}
}
}
}
```
</details>
## Nimble Operator
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`nimble_operator` | Disabled | Yes | idiomatic | No | 3.0.0
Prefer Nimble operator overloads over free matcher functions.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
expect(seagull.squawk) != "Hi!"
```
```swift
expect("Hi!") == "Hi!"
```
```swift
expect(10) > 2
```
```swift
expect(10) >= 10
```
```swift
expect(10) < 11
```
```swift
expect(10) <= 10
```
```swift
expect(x) === x
```
```swift
expect(10) == 10
```
```swift
expect(object.asyncFunction()).toEventually(equal(1))
```
```swift
expect(actual).to(haveCount(expected))
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
expect(seagull.squawk).toNot(equal("Hi"))
```
```swift
expect(12).toNot(equal(10))
```
```swift
expect(10).to(equal(10))
```
```swift
expect(10).to(beGreaterThan(8))
```
```swift
expect(10).to(beGreaterThanOrEqualTo(10))
```
```swift
expect(10).to(beLessThan(11))
```
```swift
expect(10).to(beLessThanOrEqualTo(10))
```
```swift
expect(x).to(beIdenticalTo(x))
```
```swift
expect(10) > 2
expect(10).to(beGreaterThan(2))
```
</details>
## No Extension Access Modifier
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`no_extension_access_modifier` | Disabled | No | idiomatic | No | 3.0.0
Prefer not to use extension access modifiers
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
extension String {}
```
```swift
extension String {}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
private extension String {}
```
```swift
public
extension String {}
```
```swift
open extension String {}
```
```swift
internal extension String {}
```
```swift
fileprivate extension String {}
```
</details>
## No Fallthrough Only
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`no_fallthrough_only` | Enabled | No | idiomatic | No | 3.0.0
Fallthroughs can only be used if the `case` contains at least one other statement.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
switch myvar {
case 1:
var a = 1
fallthrough
case 2:
var a = 2
}
```
```swift
switch myvar {
case "a":
var one = 1
var two = 2
fallthrough
case "b": /* comment */
var three = 3
}
```
```swift
switch myvar {
case 1:
let one = 1
case 2:
// comment
var two = 2
}
```
```swift
switch myvar {
case MyFunc(x: [1, 2, YourFunc(a: 23)], y: 2):
var three = 3
fallthrough
default:
var three = 4
}
```
```swift
switch myvar {
case .alpha:
var one = 1
case .beta:
var three = 3
fallthrough
default:
var four = 4
}
```
```swift
let aPoint = (1, -1)
switch aPoint {
case let (x, y) where x == y:
let A = "A"
case let (x, y) where x == -y:
let B = "B"
fallthrough
default:
let C = "C"
}
```
```swift
switch myvar {
case MyFun(with: { $1 }):
let one = 1
fallthrough
case "abc":
let two = 2
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
switch myvar {
case 1:
fallthrough
case 2:
var a = 1
}
```
```swift
switch myvar {
case 1:
var a = 2
case 2:
fallthrough
case 3:
var a = 3
}
```
```swift
switch myvar {
case 1: // comment
fallthrough
}
```
```swift
switch myvar {
case 1: /* multi
line
comment */
fallthrough
case 2:
var a = 2
}
```
```swift
switch myvar {
case MyFunc(x: [1, 2, YourFunc(a: 23)], y: 2):
fallthrough
default:
var three = 4
}
```
```swift
switch myvar {
case .alpha:
var one = 1
case .beta:
fallthrough
case .gamma:
var three = 3
default:
var four = 4
}
```
```swift
let aPoint = (1, -1)
switch aPoint {
case let (x, y) where x == y:
let A = "A"
case let (x, y) where x == -y:
fallthrough
default:
let B = "B"
}
```
```swift
switch myvar {
case MyFun(with: { $1 }):
fallthrough
case "abc":
let two = 2
}
```
</details>
## No Grouping Extension
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`no_grouping_extension` | Disabled | No | idiomatic | No | 3.0.0
Extensions shouldn't be used to group code within the same source file.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
protocol Food {}
extension Food {}
```
```swift
class Apples {}
extension Oranges {}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
enum Fruit {}
extension Fruit {}
```
```swift
extension Tea: Error {}
struct Tea {}
```
```swift
class Ham { class Spam {}}
extension Ham.Spam {}
```
```swift
extension External { struct Gotcha {}}
extension External.Gotcha {}
```
</details>
## Notification Center Detachment
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`notification_center_detachment` | Enabled | No | lint | No | 3.0.0
An object should only remove itself as an observer in `deinit`.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
class Foo {
deinit {
NotificationCenter.default.removeObserver(self)
}
}
```
```swift
class Foo {
func bar() {
NotificationCenter.default.removeObserver(otherObject)
}
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
class Foo {
func bar() {
NotificationCenter.default.removeObserver(self)
}
}
```
</details>
## Number Separator
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`number_separator` | Disabled | Yes | style | No | 3.0.0
Underscores should be used as thousand separator in large decimal numbers.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let foo = -100
```
```swift
let foo = -1_000
```
```swift
let foo = -1_000_000
```
```swift
let foo = -1.000_1
```
```swift
let foo = -1_000_000.000_000_1
```
```swift
let binary = -0b10000
```
```swift
let binary = -0b1000_0001
```
```swift
let hex = -0xA
```
```swift
let hex = -0xAA_BB
```
```swift
let octal = -0o21
```
```swift
let octal = -0o21_1
```
```swift
let exp = -1_000_000.000_000e2
```
```swift
let foo = +100
```
```swift
let foo = +1_000
```
```swift
let foo = +1_000_000
```
```swift
let foo = +1.000_1
```
```swift
let foo = +1_000_000.000_000_1
```
```swift
let binary = +0b10000
```
```swift
let binary = +0b1000_0001
```
```swift
let hex = +0xA
```
```swift
let hex = +0xAA_BB
```
```swift
let octal = +0o21
```
```swift
let octal = +0o21_1
```
```swift
let exp = +1_000_000.000_000e2
```
```swift
let foo = 100
```
```swift
let foo = 1_000
```
```swift
let foo = 1_000_000
```
```swift
let foo = 1.000_1
```
```swift
let foo = 1_000_000.000_000_1
```
```swift
let binary = 0b10000
```
```swift
let binary = 0b1000_0001
```
```swift
let hex = 0xA
```
```swift
let hex = 0xAA_BB
```
```swift
let octal = 0o21
```
```swift
let octal = 0o21_1
```
```swift
let exp = 1_000_000.000_000e2
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
let foo = -10_0
```
```swift
let foo = -1000
```
```swift
let foo = -1000e2
```
```swift
let foo = -1000E2
```
```swift
let foo = -1__000
```
```swift
let foo = -1.0001
```
```swift
let foo = -1_000_000.000000_1
```
```swift
let foo = -1000000.000000_1
```
```swift
let foo = +10_0
```
```swift
let foo = +1000
```
```swift
let foo = +1000e2
```
```swift
let foo = +1000E2
```
```swift
let foo = +1__000
```
```swift
let foo = +1.0001
```
```swift
let foo = +1_000_000.000000_1
```
```swift
let foo = +1000000.000000_1
```
```swift
let foo = 10_0
```
```swift
let foo = 1000
```
```swift
let foo = 1000e2
```
```swift
let foo = 1000E2
```
```swift
let foo = 1__000
```
```swift
let foo = 1.0001
```
```swift
let foo = 1_000_000.000000_1
```
```swift
let foo = 1000000.000000_1
```
</details>
## Object Literal
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`object_literal` | Disabled | No | idiomatic | No | 3.0.0
Prefer object literals over image and color inits.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let image = #imageLiteral(resourceName: "image.jpg")
```
```swift
let color = #colorLiteral(red: 0.9607843161, green: 0.7058823705, blue: 0.200000003, alpha: 1)
```
```swift
let image = UIImage(named: aVariable)
```
```swift
let image = UIImage(named: "interpolated \(variable)")
```
```swift
let color = UIColor(red: value, green: value, blue: value, alpha: 1)
```
```swift
let image = NSImage(named: aVariable)
```
```swift
let image = NSImage(named: "interpolated \(variable)")
```
```swift
let color = NSColor(red: value, green: value, blue: value, alpha: 1)
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
let image = UIImage(named: "foo")
```
```swift
let color = UIColor(red: 0.3, green: 0.3, blue: 0.3, alpha: 1)
```
```swift
let color = UIColor(red: 100 / 255.0, green: 50 / 255.0, blue: 0, alpha: 1)
```
```swift
let color = UIColor(white: 0.5, alpha: 1)
```
```swift
let image = NSImage(named: "foo")
```
```swift
let color = NSColor(red: 0.3, green: 0.3, blue: 0.3, alpha: 1)
```
```swift
let color = NSColor(red: 100 / 255.0, green: 50 / 255.0, blue: 0, alpha: 1)
```
```swift
let color = NSColor(white: 0.5, alpha: 1)
```
```swift
let image = UIImage.init(named: "foo")
```
```swift
let color = UIColor.init(red: 0.3, green: 0.3, blue: 0.3, alpha: 1)
```
```swift
let color = UIColor.init(red: 100 / 255.0, green: 50 / 255.0, blue: 0, alpha: 1)
```
```swift
let color = UIColor.init(white: 0.5, alpha: 1)
```
```swift
let image = NSImage.init(named: "foo")
```
```swift
let color = NSColor.init(red: 0.3, green: 0.3, blue: 0.3, alpha: 1)
```
```swift
let color = NSColor.init(red: 100 / 255.0, green: 50 / 255.0, blue: 0, alpha: 1)
```
```swift
let color = NSColor.init(white: 0.5, alpha: 1)
```
</details>
## Opening Brace Spacing
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`opening_brace` | Enabled | Yes | style | No | 3.0.0
Opening braces should be preceded by a single space and on the same line as the declaration.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
func abc() {
}
```
```swift
[].map() { $0 }
```
```swift
[].map({ })
```
```swift
if let a = b { }
```
```swift
while a == b { }
```
```swift
guard let a = b else { }
```
```swift
if
let a = b,
let c = d
where a == c
{ }
```
```swift
while
let a = b,
let c = d
where a == c
{ }
```
```swift
guard
let a = b,
let c = d
where a == c else
{ }
```
```swift
struct Rule {}
```
```swift
struct Parent {
struct Child {
let foo: Int
}
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
func abc(){
}
```
```swift
func abc()
{ }
```
```swift
[].map(){ $0 }
```
```swift
[].map( { } )
```
```swift
if let a = b{ }
```
```swift
while a == b{ }
```
```swift
guard let a = b else{ }
```
```swift
if
let a = b,
let c = d
where a == c{ }
```
```swift
while
let a = b,
let c = d
where a == c{ }
```
```swift
guard
let a = b,
let c = d
where a == c else{ }
```
```swift
struct Rule{}
```
```swift
struct Rule
{
}
```
```swift
struct Rule
{
}
```
```swift
struct Parent {
struct Child
{
let foo: Int
}
}
```
</details>
## Operator Usage Whitespace
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`operator_usage_whitespace` | Disabled | Yes | style | No | 3.0.0
Operators should be surrounded by a single whitespace when they are being used.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let foo = 1 + 2
```
```swift
let foo = 1 > 2
```
```swift
let foo = !false
```
```swift
let foo: Int?
```
```swift
let foo: Array<String>
```
```swift
let model = CustomView<Container<Button>, NSAttributedString>()
```
```swift
let foo: [String]
```
```swift
let foo = 1 +
2
```
```swift
let range = 1...3
```
```swift
let range = 1 ... 3
```
```swift
let range = 1..<3
```
```swift
#if swift(>=3.0)
foo()
#endif
```
```swift
array.removeAtIndex(-200)
```
```swift
let name = "image-1"
```
```swift
button.setImage(#imageLiteral(resourceName: "image-1"), for: .normal)
```
```swift
let doubleValue = -9e-11
```
```swift
let foo = GenericType<(UIViewController) -> Void>()
```
```swift
let foo = Foo<Bar<T>, Baz>()
```
```swift
let foo = SignalProducer<Signal<Value, Error>, Error>([ self.signal, next ]).flatten(.concat)
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
let foo = 1+2
```
```swift
let foo = 1 + 2
```
```swift
let foo = 1 + 2
```
```swift
let foo = 1 + 2
```
```swift
let foo=1+2
```
```swift
let foo=1 + 2
```
```swift
let foo=bar
```
```swift
let range = 1 ..< 3
```
```swift
let foo = bar ?? 0
```
```swift
let foo = bar??0
```
```swift
let foo = bar != 0
```
```swift
let foo = bar !== bar2
```
```swift
let v8 = Int8(1) << 6
```
```swift
let v8 = 1 << (6)
```
```swift
let v8 = 1 << (6)
let foo = 1 > 2
```
</details>
## Operator Function Whitespace
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`operator_whitespace` | Enabled | No | style | No | 3.0.0
Operators should be surrounded by a single whitespace when defining them.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
func <| (lhs: Int, rhs: Int) -> Int {}
```
```swift
func <|< <A>(lhs: A, rhs: A) -> A {}
```
```swift
func abc(lhs: Int, rhs: Int) -> Int {}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
func <|(lhs: Int, rhs: Int) -> Int {}
```
```swift
func <|<<A>(lhs: A, rhs: A) -> A {}
```
```swift
func <| (lhs: Int, rhs: Int) -> Int {}
```
```swift
func <|< <A>(lhs: A, rhs: A) -> A {}
```
```swift
func <| (lhs: Int, rhs: Int) -> Int {}
```
```swift
func <|< <A>(lhs: A, rhs: A) -> A {}
```
</details>
## Overridden methods call super
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`overridden_super_call` | Disabled | No | lint | No | 3.0.0
Some overridden methods should always call super
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
class VC: UIViewController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
}
}
```
```swift
class VC: UIViewController {
override func viewWillAppear(_ animated: Bool) {
self.method1()
super.viewWillAppear(animated)
self.method2()
}
}
```
```swift
class VC: UIViewController {
override func loadView() {
}
}
```
```swift
class Some {
func viewWillAppear(_ animated: Bool) {
}
}
```
```swift
class VC: UIViewController {
override func viewDidLoad() {
defer {
super.viewDidLoad()
}
}
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
class VC: UIViewController {
override func viewWillAppear(_ animated: Bool) {
//Not calling to super
self.method()
}
}
```
```swift
class VC: UIViewController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
//Other code
super.viewWillAppear(animated)
}
}
```
```swift
class VC: UIViewController {
override func didReceiveMemoryWarning() {
}
}
```
</details>
## Override in Extension
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`override_in_extension` | Disabled | No | lint | No | 3.0.0
Extensions shouldn't override declarations.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
extension Person {
var age: Int { return 42 }
}
```
```swift
extension Person {
func celebrateBirthday() {}
}
```
```swift
class Employee: Person {
override func celebrateBirthday() {}
}
```
```swift
class Foo: NSObject {}
extension Foo {
override var description: String { return "" }
}
```
```swift
struct Foo {
class Bar: NSObject {}
}
extension Foo.Bar {
override var description: String { return "" }
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
extension Person {
override var age: Int { return 42 }
}
```
```swift
extension Person {
override func celebrateBirthday() {}
}
```
</details>
## Pattern Matching Keywords
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`pattern_matching_keywords` | Disabled | No | idiomatic | No | 3.0.0
Combine multiple pattern matching bindings by moving keywords out of tuples.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
switch foo {
default: break
}
```
```swift
switch foo {
case 1: break
}
```
```swift
switch foo {
case bar: break
}
```
```swift
switch foo {
case let (x, y): break
}
```
```swift
switch foo {
case .foo(let x): break
}
```
```swift
switch foo {
case let .foo(x, y): break
}
```
```swift
switch foo {
case .foo(let x), .bar(let x): break
}
```
```swift
switch foo {
case .foo(let x, var y): break
}
```
```swift
switch foo {
case var (x, y): break
}
```
```swift
switch foo {
case .foo(var x): break
}
```
```swift
switch foo {
case var .foo(x, y): break
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
switch foo {
case (let x, let y): break
}
```
```swift
switch foo {
case .foo(let x, let y): break
}
```
```swift
switch foo {
case (.yamlParsing(let x), .yamlParsing(let y)): break
}
```
```swift
switch foo {
case (var x, var y): break
}
```
```swift
switch foo {
case .foo(var x, var y): break
}
```
```swift
switch foo {
case (.yamlParsing(var x), .yamlParsing(var y)): break
}
```
</details>
## Prefixed Top-Level Constant
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`prefixed_toplevel_constant` | Disabled | No | style | No | 3.0.0
Top-level constants should be prefixed by `k`.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
private let kFoo = 20.0
```
```swift
public let kFoo = false
```
```swift
internal let kFoo = "Foo"
```
```swift
let kFoo = true
```
```swift
struct Foo {
let bar = 20.0
}
```
```swift
private var foo = 20.0
```
```swift
public var foo = false
```
```swift
internal var foo = "Foo"
```
```swift
var foo = true
```
```swift
var foo = true, bar = true
```
```swift
var foo = true, let kFoo = true
```
```swift
let
kFoo = true
```
```swift
var foo: Int {
return a + b
}
```
```swift
let kFoo = {
return a + b
}()
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
private let Foo = 20.0
```
```swift
public let Foo = false
```
```swift
internal let Foo = "Foo"
```
```swift
let Foo = true
```
```swift
let foo = 2, bar = true
```
```swift
var foo = true, let Foo = true
```
```swift
let
foo = true
```
```swift
let foo = {
return a + b
}()
```
</details>
## Private Actions
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`private_action` | Disabled | No | lint | No | 3.0.0
IBActions should be private.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
class Foo {
@IBAction private func barButtonTapped(_ sender: UIButton) {}
}
```
```swift
struct Foo {
@IBAction private func barButtonTapped(_ sender: UIButton) {}
}
```
```swift
class Foo {
@IBAction fileprivate func barButtonTapped(_ sender: UIButton) {}
}
```
```swift
struct Foo {
@IBAction fileprivate func barButtonTapped(_ sender: UIButton) {}
}
```
```swift
private extension Foo {
@IBAction func barButtonTapped(_ sender: UIButton) {}
}
```
```swift
fileprivate extension Foo {
@IBAction func barButtonTapped(_ sender: UIButton) {}
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
class Foo {
@IBAction func barButtonTapped(_ sender: UIButton) {}
}
```
```swift
struct Foo {
@IBAction func barButtonTapped(_ sender: UIButton) {}
}
```
```swift
class Foo {
@IBAction public func barButtonTapped(_ sender: UIButton) {}
}
```
```swift
struct Foo {
@IBAction public func barButtonTapped(_ sender: UIButton) {}
}
```
```swift
class Foo {
@IBAction internal func barButtonTapped(_ sender: UIButton) {}
}
```
```swift
struct Foo {
@IBAction internal func barButtonTapped(_ sender: UIButton) {}
}
```
```swift
extension Foo {
@IBAction func barButtonTapped(_ sender: UIButton) {}
}
```
```swift
extension Foo {
@IBAction public func barButtonTapped(_ sender: UIButton) {}
}
```
```swift
extension Foo {
@IBAction internal func barButtonTapped(_ sender: UIButton) {}
}
```
```swift
public extension Foo {
@IBAction func barButtonTapped(_ sender: UIButton) {}
}
```
```swift
internal extension Foo {
@IBAction func barButtonTapped(_ sender: UIButton) {}
}
```
</details>
## Private Outlets
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`private_outlet` | Disabled | No | lint | No | 3.0.0
IBOutlets should be private to avoid leaking UIKit to higher layers.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
class Foo {
@IBOutlet private var label: UILabel?
}
```
```swift
class Foo {
@IBOutlet private var label: UILabel!
}
```
```swift
class Foo {
var notAnOutlet: UILabel
}
```
```swift
class Foo {
@IBOutlet weak private var label: UILabel?
}
```
```swift
class Foo {
@IBOutlet private weak var label: UILabel?
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
class Foo {
@IBOutlet var label: UILabel?
}
```
```swift
class Foo {
@IBOutlet var label: UILabel!
}
```
</details>
## Private over fileprivate
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`private_over_fileprivate` | Enabled | Yes | idiomatic | No | 3.0.0
Prefer `private` over `fileprivate` declarations.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
extension String {}
```
```swift
private extension String {}
```
```swift
public
enum MyEnum {}
```
```swift
open extension
String {}
```
```swift
internal extension String {}
```
```swift
extension String {
fileprivate func Something(){}
}
```
```swift
class MyClass {
fileprivate let myInt = 4
}
```
```swift
class MyClass {
fileprivate(set) var myInt = 4
}
```
```swift
struct Outter {
struct Inter {
fileprivate struct Inner {}
}
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
fileprivate enum MyEnum {}
```
```swift
fileprivate class MyClass {
fileprivate(set) var myInt = 4
}
```
</details>
## Private Unit Test
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`private_unit_test` | Enabled | No | lint | No | 3.0.0
Unit tests marked private are silently skipped.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
class FooTest: XCTestCase { func test1() {}
internal func test2() {}
public func test3() {}
}
```
```swift
internal class FooTest: XCTestCase { func test1() {}
internal func test2() {}
public func test3() {}
}
```
```swift
public class FooTest: XCTestCase { func test1() {}
internal func test2() {}
public func test3() {}
}
```
```swift
private class Foo: NSObject { func test1() {}
internal func test2() {}
public func test3() {}
}
```
```swift
private class Foo { func test1() {}
internal func test2() {}
public func test3() {}
}
```
```swift
public class FooTest: XCTestCase { func test1(param: Int) {}
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
private class FooTest: XCTestCase { func test1() {}
internal func test2() {}
public func test3() {}
private func test4() {}
}
```
```swift
class FooTest: XCTestCase { func test1() {}
internal func test2() {}
public func test3() {}
private func test4() {}
}
```
```swift
internal class FooTest: XCTestCase { func test1() {}
internal func test2() {}
public func test3() {}
private func test4() {}
}
```
```swift
public class FooTest: XCTestCase { func test1() {}
internal func test2() {}
public func test3() {}
private func test4() {}
}
```
</details>
## Prohibited Interface Builder
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`prohibited_interface_builder` | Disabled | No | lint | No | 3.0.0
Creating views using Interface Builder should be avoided.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
class ViewController: UIViewController {
var label: UILabel!
}
```
```swift
class ViewController: UIViewController {
@objc func buttonTapped(_ sender: UIButton) {}
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
class ViewController: UIViewController {
@IBOutlet var label: UILabel!
}
```
```swift
class ViewController: UIViewController {
@IBAction func buttonTapped(_ sender: UIButton) {}
}
```
</details>
## Prohibited calls to super
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`prohibited_super_call` | Disabled | No | lint | No | 3.0.0
Some methods should not call super
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
class VC: UIViewController {
override func loadView() {
}
}
```
```swift
class NSView {
func updateLayer() {
self.method1()
}
}
```
```swift
public class FileProviderExtension: NSFileProviderExtension {
override func providePlaceholder(at url: URL, completionHandler: @escaping (Error?) -> Void) {
guard let identifier = persistentIdentifierForItem(at: url) else {
completionHandler(NSFileProviderError(.noSuchItem))
return
}
}
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
class VC: UIViewController {
override func loadView() {
super.loadView()
}
}
```
```swift
class VC: NSFileProviderExtension {
override func providePlaceholder(at url: URL, completionHandler: @escaping (Error?) -> Void) {
self.method1()
super.providePlaceholder(at:url, completionHandler: completionHandler)
}
}
```
```swift
class VC: NSView {
override func updateLayer() {
self.method1()
super.updateLayer()
self.method2()
}
}
```
```swift
class VC: NSView {
override func updateLayer() {
defer {
super.updateLayer()
}
}
}
```
</details>
## Protocol Property Accessors Order
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`protocol_property_accessors_order` | Enabled | Yes | style | No | 3.0.0
When declaring properties in protocols, the order of accessors should be `get set`.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
protocol Foo {
var bar: String { get set }
}
```
```swift
protocol Foo {
var bar: String { get }
}
```
```swift
protocol Foo {
var bar: String { set }
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
protocol Foo {
var bar: String { set get }
}
```
</details>
## Quick Discouraged Call
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`quick_discouraged_call` | Disabled | No | lint | No | 3.0.0
Discouraged call inside 'describe' and/or 'context' block.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
class TotoTests: QuickSpec {
override func spec() {
describe("foo") {
beforeEach {
let foo = Foo()
foo.toto()
}
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
describe("foo") {
beforeEach {
let foo = Foo()
foo.toto()
}
afterEach {
let foo = Foo()
foo.toto()
}
describe("bar") {
}
context("bar") {
}
it("bar") {
let foo = Foo()
foo.toto()
}
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
describe("foo") {
itBehavesLike("bar")
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
describe("foo") {
it("does something") {
let foo = Foo()
foo.toto()
}
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
context("foo") {
afterEach { toto.append(foo) }
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
xcontext("foo") {
afterEach { toto.append(foo) }
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
xdescribe("foo") {
afterEach { toto.append(foo) }
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
describe("foo") {
xit("does something") {
let foo = Foo()
foo.toto()
}
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
fcontext("foo") {
afterEach { toto.append(foo) }
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
fdescribe("foo") {
afterEach { toto.append(foo) }
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
describe("foo") {
fit("does something") {
let foo = Foo()
foo.toto()
}
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
fitBehavesLike("foo")
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
xitBehavesLike("foo")
}
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
class TotoTests {
override func spec() {
describe("foo") {
let foo = Foo()
}
}
}
class TotoTests: QuickSpec {
override func spec() {
describe("foo") {
let foo = Foo()
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
describe("foo") {
let foo = Foo()
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
describe("foo") {
context("foo") {
let foo = Foo()
}
context("bar") {
let foo = Foo()
foo.bar()
it("does something") {
let foo = Foo()
foo.toto()
}
}
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
describe("foo") {
context("foo") {
context("foo") {
beforeEach {
let foo = Foo()
foo.toto()
}
it("bar") {
}
context("foo") {
let foo = Foo()
}
}
}
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
context("foo") {
let foo = Foo()
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
sharedExamples("foo") {
let foo = Foo()
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
describe("foo") {
foo()
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
context("foo") {
foo()
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
sharedExamples("foo") {
foo()
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
xdescribe("foo") {
let foo = Foo()
}
fdescribe("foo") {
let foo = Foo()
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
xcontext("foo") {
let foo = Foo()
}
fcontext("foo") {
let foo = Foo()
}
}
}
```
</details>
## Quick Discouraged Focused Test
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`quick_discouraged_focused_test` | Disabled | No | lint | No | 3.0.0
Discouraged focused test. Other tests won't run while this one is focused.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
class TotoTests: QuickSpec {
override func spec() {
describe("foo") {
describe("bar") { }
context("bar") {
it("bar") { }
}
it("bar") { }
itBehavesLike("bar")
}
}
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
class TotoTests: QuickSpec {
override func spec() {
fdescribe("foo") { }
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
fcontext("foo") { }
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
fit("foo") { }
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
describe("foo") {
fit("bar") { }
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
context("foo") {
fit("bar") { }
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
describe("foo") {
context("bar") {
fit("toto") { }
}
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
fitBehavesLike("foo")
}
}
```
</details>
## Quick Discouraged Pending Test
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`quick_discouraged_pending_test` | Disabled | No | lint | No | 3.0.0
Discouraged pending test. This test won't run while it's marked as pending.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
class TotoTests: QuickSpec {
override func spec() {
describe("foo") {
describe("bar") { }
context("bar") {
it("bar") { }
}
it("bar") { }
itBehavesLike("bar")
}
}
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
class TotoTests: QuickSpec {
override func spec() {
xdescribe("foo") { }
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
xcontext("foo") { }
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
xit("foo") { }
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
describe("foo") {
xit("bar") { }
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
context("foo") {
xit("bar") { }
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
describe("foo") {
context("bar") {
xit("toto") { }
}
}
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
pending("foo")
}
}
```
```swift
class TotoTests: QuickSpec {
override func spec() {
xitBehavesLike("foo")
}
}
```
</details>
## Redundant Discardable Let
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`redundant_discardable_let` | Enabled | Yes | style | No | 3.0.0
Prefer `_ = foo()` over `let _ = foo()` when discarding a result from a function.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
_ = foo()
```
```swift
if let _ = foo() { }
```
```swift
guard let _ = foo() else { return }
```
```swift
let _: ExplicitType = foo()
```
```swift
while let _ = SplashStyle(rawValue: maxValue) { maxValue += 1 }
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
let _ = foo()
```
```swift
if _ = foo() { let _ = bar() }
```
</details>
## Redundant Nil Coalescing
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`redundant_nil_coalescing` | Disabled | Yes | idiomatic | No | 3.0.0
nil coalescing operator is only evaluated if the lhs is nil, coalescing operator with nil as rhs is redundant
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
var myVar: Int?; myVar ?? 0
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
var myVar: Int? = nil; myVar ?? nil
```
```swift
var myVar: Int? = nil; myVar??nil
```
</details>
## Redundant Optional Initialization
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`redundant_optional_initialization` | Enabled | Yes | idiomatic | No | 3.0.0
Initializing an optional variable with nil is redundant.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
var myVar: Int?
```
```swift
let myVar: Int? = nil
```
```swift
var myVar: Int? = 0
```
```swift
func foo(bar: Int? = 0) { }
```
```swift
var myVar: Optional<Int>
```
```swift
let myVar: Optional<Int> = nil
```
```swift
var myVar: Optional<Int> = 0
```
```swift
var foo: Int? {
if bar != nil { }
return 0
}
```
```swift
var foo: Int? = {
if bar != nil { }
return 0
}()
```
```swift
lazy var test: Int? = nil
```
```swift
func funcName() {
var myVar: String?
}
```
```swift
func funcName() {
let myVar: String? = nil
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
var myVar: Int? = nil
```
```swift
var myVar: Optional<Int> = nil
```
```swift
var myVar: Int?=nil
```
```swift
var myVar: Optional<Int>=nil
```
```swift
func funcName() {
var myVar: String? = nil
}
```
</details>
## Redundant Set Access Control Rule
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`redundant_set_access_control` | Enabled | No | idiomatic | No | 4.1.0
Property setter access level shouldn't be explicit if it's the same as the variable access level.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
private(set) public var foo: Int
```
```swift
public let foo: Int
```
```swift
public var foo: Int
```
```swift
var foo: Int
```
```swift
private final class A {
private(set) var value: Int
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
private(set) private var foo: Int
```
```swift
fileprivate(set) fileprivate var foo: Int
```
```swift
internal(set) internal var foo: Int
```
```swift
public(set) public var foo: Int
```
```swift
open class Foo {
open(set) open var bar: Int
}
```
```swift
class A {
internal(set) var value: Int
}
```
```swift
fileprivate class A {
fileprivate(set) var value: Int
}
```
</details>
## Redundant String Enum Value
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`redundant_string_enum_value` | Enabled | No | idiomatic | No | 3.0.0
String enum values can be omitted when they are equal to the enumcase name.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
enum Numbers: String {
case one
case two
}
```
```swift
enum Numbers: Int {
case one = 1
case two = 2
}
```
```swift
enum Numbers: String {
case one = "ONE"
case two = "TWO"
}
```
```swift
enum Numbers: String {
case one = "ONE"
case two = "two"
}
```
```swift
enum Numbers: String {
case one, two
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
enum Numbers: String {
case one = "one"
case two = "two"
}
```
```swift
enum Numbers: String {
case one = "one", two = "two"
}
```
```swift
enum Numbers: String {
case one, two = "two"
}
```
</details>
## Redundant Type Annotation
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`redundant_type_annotation` | Disabled | Yes | idiomatic | No | 3.0.0
Variables should not have redundant type annotation
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
var url = URL()
```
```swift
var url: CustomStringConvertible = URL()
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
var url:URL=URL()
```
```swift
var url:URL = URL(string: "")
```
```swift
var url: URL = URL()
```
```swift
let url: URL = URL()
```
```swift
lazy var url: URL = URL()
```
```swift
let alphanumerics: CharacterSet = CharacterSet.alphanumerics
```
```swift
class ViewController: UIViewController {
func someMethod() {
let myVar: Int = Int(5)
}
}
```
</details>
## Redundant Void Return
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`redundant_void_return` | Enabled | Yes | idiomatic | No | 3.0.0
Returning Void in a function declaration is redundant.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
func foo() {}
```
```swift
func foo() -> Int {}
```
```swift
func foo() -> Int -> Void {}
```
```swift
func foo() -> VoidResponse
```
```swift
let foo: Int -> Void
```
```swift
func foo() -> Int -> () {}
```
```swift
let foo: Int -> ()
```
```swift
func foo() -> ()?
```
```swift
func foo() -> ()!
```
```swift
func foo() -> Void?
```
```swift
func foo() -> Void!
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
func foo() -> Void {}
```
```swift
protocol Foo {
func foo() -> Void
}
```
```swift
func foo() -> () {}
```
```swift
protocol Foo {
func foo() -> ()
}
```
</details>
## Required Enum Case
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`required_enum_case` | Disabled | No | lint | No | 3.0.0
Enums conforming to a specified protocol must implement a specific case(s).
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
enum MyNetworkResponse: String, NetworkResponsable {
case success, error, notConnected
}
```
```swift
enum MyNetworkResponse: String, NetworkResponsable {
case success, error, notConnected(error: Error)
}
```
```swift
enum MyNetworkResponse: String, NetworkResponsable {
case success
case error
case notConnected
}
```
```swift
enum MyNetworkResponse: String, NetworkResponsable {
case success
case error
case notConnected(error: Error)
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
enum MyNetworkResponse: String, NetworkResponsable {
case success, error
}
```
```swift
enum MyNetworkResponse: String, NetworkResponsable {
case success, error
}
```
```swift
enum MyNetworkResponse: String, NetworkResponsable {
case success
case error
}
```
```swift
enum MyNetworkResponse: String, NetworkResponsable {
case success
case error
}
```
</details>
## Returning Whitespace
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`return_arrow_whitespace` | Enabled | Yes | style | No | 3.0.0
Return arrow and return type should be separated by a single space or on a separate line.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
func abc() -> Int {}
```
```swift
func abc() -> [Int] {}
```
```swift
func abc() -> (Int, Int) {}
```
```swift
var abc = {(param: Int) -> Void in }
```
```swift
func abc() ->
Int {}
```
```swift
func abc()
-> Int {}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
func abc()->Int {}
```
```swift
func abc()->[Int] {}
```
```swift
func abc()->(Int, Int) {}
```
```swift
func abc()-> Int {}
```
```swift
func abc() ->Int {}
```
```swift
func abc() -> Int {}
```
```swift
var abc = {(param: Int) ->Bool in }
```
```swift
var abc = {(param: Int)->Bool in }
```
</details>
## Shorthand Operator
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`shorthand_operator` | Enabled | No | style | No | 3.0.0
Prefer shorthand operators (+=, -=, *=, /=) over doing the operation and assigning.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
foo -= 1
```
```swift
foo -= variable
```
```swift
foo -= bar.method()
```
```swift
self.foo = foo - 1
```
```swift
foo = self.foo - 1
```
```swift
page = ceilf(currentOffset - pageWidth)
```
```swift
foo = aMethod(foo - bar)
```
```swift
foo = aMethod(bar - foo)
```
```swift
foo /= 1
```
```swift
foo /= variable
```
```swift
foo /= bar.method()
```
```swift
self.foo = foo / 1
```
```swift
foo = self.foo / 1
```
```swift
page = ceilf(currentOffset / pageWidth)
```
```swift
foo = aMethod(foo / bar)
```
```swift
foo = aMethod(bar / foo)
```
```swift
foo += 1
```
```swift
foo += variable
```
```swift
foo += bar.method()
```
```swift
self.foo = foo + 1
```
```swift
foo = self.foo + 1
```
```swift
page = ceilf(currentOffset + pageWidth)
```
```swift
foo = aMethod(foo + bar)
```
```swift
foo = aMethod(bar + foo)
```
```swift
foo *= 1
```
```swift
foo *= variable
```
```swift
foo *= bar.method()
```
```swift
self.foo = foo * 1
```
```swift
foo = self.foo * 1
```
```swift
page = ceilf(currentOffset * pageWidth)
```
```swift
foo = aMethod(foo * bar)
```
```swift
foo = aMethod(bar * foo)
```
```swift
var helloWorld = "world!"
helloWorld = "Hello, " + helloWorld
```
```swift
angle = someCheck ? angle : -angle
```
```swift
seconds = seconds * 60 + value
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
foo = foo - 1
```
```swift
foo = foo - aVariable
```
```swift
foo = foo - bar.method()
```
```swift
foo.aProperty = foo.aProperty - 1
```
```swift
self.aProperty = self.aProperty - 1
```
```swift
foo = foo / 1
```
```swift
foo = foo / aVariable
```
```swift
foo = foo / bar.method()
```
```swift
foo.aProperty = foo.aProperty / 1
```
```swift
self.aProperty = self.aProperty / 1
```
```swift
foo = foo + 1
```
```swift
foo = foo + aVariable
```
```swift
foo = foo + bar.method()
```
```swift
foo.aProperty = foo.aProperty + 1
```
```swift
self.aProperty = self.aProperty + 1
```
```swift
foo = foo * 1
```
```swift
foo = foo * aVariable
```
```swift
foo = foo * bar.method()
```
```swift
foo.aProperty = foo.aProperty * 1
```
```swift
self.aProperty = self.aProperty * 1
```
```swift
n = n + i / outputLength
```
```swift
n = n - i / outputLength
```
</details>
## Single Test Class
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`single_test_class` | Disabled | No | style | No | 3.0.0
Test files should contain a single QuickSpec or XCTestCase class.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
class FooTests { }
```
```swift
class FooTests: QuickSpec { }
```
```swift
class FooTests: XCTestCase { }
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
class FooTests: QuickSpec { }
class BarTests: QuickSpec { }
```
```swift
class FooTests: QuickSpec { }
class BarTests: QuickSpec { }
class TotoTests: QuickSpec { }
```
```swift
class FooTests: XCTestCase { }
class BarTests: XCTestCase { }
```
```swift
class FooTests: XCTestCase { }
class BarTests: XCTestCase { }
class TotoTests: XCTestCase { }
```
```swift
class FooTests: QuickSpec { }
class BarTests: XCTestCase { }
```
```swift
class FooTests: QuickSpec { }
class BarTests: XCTestCase { }
class TotoTests { }
```
</details>
## Min or Max over Sorted First or Last
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`sorted_first_last` | Disabled | No | performance | No | 3.0.0
Prefer using `min()` or `max()` over `sorted().first` or `sorted().last`
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let min = myList.min()
```
```swift
let min = myList.min(by: { $0 < $1 })
```
```swift
let min = myList.min(by: >)
```
```swift
let min = myList.max()
```
```swift
let min = myList.max(by: { $0 < $1 })
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
myList.sorted().first
```
```swift
myList.sorted(by: { $0.description < $1.description }).first
```
```swift
myList.sorted(by: >).first
```
```swift
myList.map { $0 + 1 }.sorted().first
```
```swift
myList.sorted(by: someFunction).first
```
```swift
myList.map { $0 + 1 }.sorted { $0.description < $1.description }.first
```
```swift
myList.sorted().last
```
```swift
myList.sorted().last?.something()
```
```swift
myList.sorted(by: { $0.description < $1.description }).last
```
```swift
myList.map { $0 + 1 }.sorted().last
```
```swift
myList.sorted(by: someFunction).last
```
```swift
myList.map { $0 + 1 }.sorted { $0.description < $1.description }.last
```
```swift
myList.map { $0 + 1 }.sorted { $0.first < $1.first }.last
```
</details>
## Sorted Imports
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`sorted_imports` | Disabled | Yes | style | No | 3.0.0
Imports should be sorted.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
import AAA
import BBB
import CCC
import DDD
```
```swift
import Alamofire
import API
```
```swift
import labc
import Ldef
```
```swift
import BBB
// comment
import AAA
import CCC
```
```swift
@testable import AAA
import CCC
```
```swift
import AAA
@testable import CCC
```
```swift
import EEE.A
import FFF.B
#if os(Linux)
import DDD.A
import EEE.B
#else
import CCC
import DDD.B
#endif
import AAA
import BBB
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
import AAA
import ZZZ
import BBB
import CCC
```
```swift
import DDD
// comment
import CCC
import AAA
```
```swift
@testable import CCC
import AAA
```
```swift
import CCC
@testable import AAA
```
```swift
import FFF.B
import EEE.A
#if os(Linux)
import DDD.A
import EEE.B
#else
import DDD.B
import CCC
#endif
import AAA
import BBB
```
</details>
## Statement Position
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`statement_position` | Enabled | Yes | style | No | 3.0.0
Else and catch should be on the same line, one space after the previous declaration.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
} else if {
```
```swift
} else {
```
```swift
} catch {
```
```swift
"}else{"
```
```swift
struct A { let catchphrase: Int }
let a = A(
catchphrase: 0
)
```
```swift
struct A { let `catch`: Int }
let a = A(
`catch`: 0
)
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
}else if {
```
```swift
} else {
```
```swift
}
catch {
```
```swift
}
catch {
```
</details>
## Strict fileprivate
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`strict_fileprivate` | Disabled | No | idiomatic | No | 3.0.0
`fileprivate` should be avoided.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
extension String {}
```
```swift
private extension String {}
```
```swift
public
extension String {}
```
```swift
open extension
String {}
```
```swift
internal extension String {}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
fileprivate extension String {}
```
```swift
fileprivate
extension String {}
```
```swift
fileprivate extension
String {}
```
```swift
extension String {
fileprivate func Something(){}
}
```
```swift
class MyClass {
fileprivate let myInt = 4
}
```
```swift
class MyClass {
fileprivate(set) var myInt = 4
}
```
```swift
struct Outter {
struct Inter {
fileprivate struct Inner {}
}
}
```
</details>
## Superfluous Disable Command
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`superfluous_disable_command` | Enabled | No | lint | No | 3.0.0
SwiftLint 'disable' commands are superfluous when the disabled rule would not have triggered a violation in the disabled region.
## Switch and Case Statement Alignment
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`switch_case_alignment` | Enabled | No | style | No | 3.0.0
Case statements should vertically align with their enclosing switch statement, or indented if configured otherwise.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
switch someBool {
case true: // case 1
print('red')
case false:
/*
case 2
*/
if case let .someEnum(val) = someFunc() {
print('blue')
}
}
enum SomeEnum {
case innocent
}
```
```swift
if aBool {
switch someBool {
case true:
print('red')
case false:
print('blue')
}
}
```
```swift
switch someInt {
// comments ignored
case 0:
// zero case
print('Zero')
case 1:
print('One')
default:
print('Some other number')
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
switch someBool {
case true:
print("red")
case false:
print("blue")
}
```
```swift
if aBool {
switch someBool {
case true:
print('red')
case false:
print('blue')
}
}
```
```swift
switch someInt {
case 0:
print('Zero')
case 1:
print('One')
default:
print('Some other number')
}
```
```swift
switch someBool {
case true:
print('red')
case false:
print('blue')
}
```
```swift
if aBool {
switch someBool {
case true:
print('red')
case false:
print('blue')
}
}
```
</details>
## Switch Case on Newline
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`switch_case_on_newline` | Disabled | No | style | No | 3.0.0
Cases inside a switch should always be on a newline
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
/*case 1: */return true
```
```swift
//case 1:
return true
```
```swift
let x = [caseKey: value]
```
```swift
let x = [key: .default]
```
```swift
if case let .someEnum(value) = aFunction([key: 2]) { }
```
```swift
guard case let .someEnum(value) = aFunction([key: 2]) { }
```
```swift
for case let .someEnum(value) = aFunction([key: 2]) { }
```
```swift
enum Environment {
case development
}
```
```swift
enum Environment {
case development(url: URL)
}
```
```swift
enum Environment {
case development(url: URL) // staging
}
```
```swift
switch foo {
case 1:
return true
}
```
```swift
switch foo {
default:
return true
}
```
```swift
switch foo {
case let value:
return true
}
```
```swift
switch foo {
case .myCase: // error from network
return true
}
```
```swift
switch foo {
case let .myCase(value) where value > 10:
return false
}
```
```swift
switch foo {
case let .myCase(value)
where value > 10:
return false
}
```
```swift
switch foo {
case let .myCase(code: lhsErrorCode, description: _)
where lhsErrorCode > 10:
return false
}
```
```swift
switch foo {
case #selector(aFunction(_:)):
return false
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
switch foo {
case 1: return true
}
```
```swift
switch foo {
case let value: return true
}
```
```swift
switch foo {
default: return true
}
```
```swift
switch foo {
case "a string": return false
}
```
```swift
switch foo {
case .myCase: return false // error from network
}
```
```swift
switch foo {
case let .myCase(value) where value > 10: return false
}
```
```swift
switch foo {
case #selector(aFunction(_:)): return false
}
```
```swift
switch foo {
case let .myCase(value)
where value > 10: return false
}
```
```swift
switch foo {
case .first,
.second: return false
}
```
</details>
## Syntactic Sugar
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`syntactic_sugar` | Enabled | No | idiomatic | No | 3.0.0
Shorthand syntactic sugar should be used, i.e. [Int] instead of Array<Int>.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let x: [Int]
```
```swift
let x: [Int: String]
```
```swift
let x: Int?
```
```swift
func x(a: [Int], b: Int) -> [Int: Any]
```
```swift
let x: Int!
```
```swift
extension Array {
func x() { }
}
```
```swift
extension Dictionary {
func x() { }
}
```
```swift
let x: CustomArray<String>
```
```swift
var currentIndex: Array<OnboardingPage>.Index?
```
```swift
func x(a: [Int], b: Int) -> Array<Int>.Index
```
```swift
unsafeBitCast(nonOptionalT, to: Optional<T>.self)
```
```swift
type is Optional<String>.Type
```
```swift
let x: Foo.Optional<String>
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
let x: Array<String>
```
```swift
let x: Dictionary<Int, String>
```
```swift
let x: Optional<Int>
```
```swift
let x: ImplicitlyUnwrappedOptional<Int>
```
```swift
func x(a: Array<Int>, b: Int) -> [Int: Any]
```
```swift
func x(a: [Int], b: Int) -> Dictionary<Int, String>
```
```swift
func x(a: Array<Int>, b: Int) -> Dictionary<Int, String>
```
```swift
let x = Array<String>.array(of: object)
```
```swift
let x: Swift.Optional<String>
```
</details>
## Todo
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`todo` | Enabled | No | lint | No | 3.0.0
TODOs and FIXMEs should be resolved.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
// notaTODO:
```
```swift
// notaFIXME:
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
// ↓TODO:
```
```swift
// ↓FIXME:
```
```swift
// ↓TODO(note)
```
```swift
// ↓FIXME(note)
```
```swift
/* ↓FIXME: */
```
```swift
/* ↓TODO: */
```
```swift
/** ↓FIXME: */
```
```swift
/** ↓TODO: */
```
</details>
## Toggle Bool
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`toggle_bool` | Disabled | No | idiomatic | No | 4.2.0
Prefer `someBool.toggle()` over `someBool = !someBool`.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
isHidden.toggle()
```
```swift
view.clipsToBounds.toggle()
```
```swift
func foo() { abc.toggle() }
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
isHidden = !isHidden
```
```swift
view.clipsToBounds = !view.clipsToBounds
```
```swift
func foo() { abc = !abc }
```
</details>
## Trailing Closure
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`trailing_closure` | Disabled | No | style | No | 3.0.0
Trailing closure syntax should be used whenever possible.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
foo.map { $0 + 1 }
```
```swift
foo.bar()
```
```swift
foo.reduce(0) { $0 + 1 }
```
```swift
if let foo = bar.map({ $0 + 1 }) { }
```
```swift
foo.something(param1: { $0 }, param2: { $0 + 1 })
```
```swift
offsets.sorted { $0.offset < $1.offset }
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
foo.map({ $0 + 1 })
```
```swift
foo.reduce(0, combine: { $0 + 1 })
```
```swift
offsets.sorted(by: { $0.offset < $1.offset })
```
```swift
foo.something(0, { $0 + 1 })
```
</details>
## Trailing Comma
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`trailing_comma` | Enabled | Yes | style | No | 3.0.0
Trailing commas in arrays and dictionaries should be avoided/enforced.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let foo = [1, 2, 3]
```
```swift
let foo = []
```
```swift
let foo = [:]
```
```swift
let foo = [1: 2, 2: 3]
```
```swift
let foo = [Void]()
```
```swift
let example = [ 1,
2
// 3,
]
```
```swift
foo([1: "\(error)"])
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
let foo = [1, 2, 3,]
```
```swift
let foo = [1, 2, 3, ]
```
```swift
let foo = [1, 2, 3 ,]
```
```swift
let foo = [1: 2, 2: 3, ]
```
```swift
struct Bar {
let foo = [1: 2, 2: 3, ]
}
```
```swift
let foo = [1, 2, 3,] + [4, 5, 6,]
```
```swift
let example = [ 1,
2,
// 3,
]
```
```swift
let foo = ["אבג", "αβγ", "🇺🇸",]
```
</details>
## Trailing Newline
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`trailing_newline` | Enabled | Yes | style | No | 3.0.0
Files should have a single trailing newline.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let a = 0
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
let a = 0
```
```swift
let a = 0
```
</details>
## Trailing Semicolon
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`trailing_semicolon` | Enabled | Yes | idiomatic | No | 3.0.0
Lines should not have trailing semicolons.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let a = 0
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
let a = 0;
```
```swift
let a = 0;
let b = 1
```
```swift
let a = 0;;
```
```swift
let a = 0; ;;
```
```swift
let a = 0; ; ;
```
</details>
## Trailing Whitespace
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`trailing_whitespace` | Enabled | Yes | style | No | 3.0.0
Lines should not have trailing whitespace.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let name: String
```
```swift
//
```
```swift
//
```
```swift
let name: String //
```
```swift
let name: String //
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
let name: String
```
```swift
/* */ let name: String
```
</details>
## Type Body Length
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`type_body_length` | Enabled | No | metrics | No | 3.0.0
Type bodies should not span too many lines.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
class Abc {
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
}
```
```swift
class Abc {
}
```
```swift
class Abc {
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
}
```
```swift
class Abc {
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
/* this is
a multiline comment
*/
}
```
```swift
struct Abc {
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
}
```
```swift
struct Abc {
}
```
```swift
struct Abc {
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
}
```
```swift
struct Abc {
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
/* this is
a multiline comment
*/
}
```
```swift
enum Abc {
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
}
```
```swift
enum Abc {
}
```
```swift
enum Abc {
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
// this is a comment
}
```
```swift
enum Abc {
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
/* this is
a multiline comment
*/
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
class Abc {
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
}
```
```swift
struct Abc {
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
}
```
```swift
enum Abc {
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
let abc = 0
}
```
</details>
## Type Name
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`type_name` | Enabled | No | idiomatic | No | 3.0.0
Type name should only contain alphanumeric characters, start with an uppercase character and span between 3 and 40 characters in length.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
class MyType {}
```
```swift
private class _MyType {}
```
```swift
class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA {}
```
```swift
struct MyType {}
```
```swift
private struct _MyType {}
```
```swift
struct AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA {}
```
```swift
enum MyType {}
```
```swift
private enum _MyType {}
```
```swift
enum AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA {}
```
```swift
typealias Foo = Void
```
```swift
private typealias Foo = Void
```
```swift
protocol Foo {
associatedtype Bar
}
```
```swift
protocol Foo {
associatedtype Bar: Equatable
}
```
```swift
enum MyType {
case value
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
class myType {}
```
```swift
class _MyType {}
```
```swift
private class MyType_ {}
```
```swift
class My {}
```
```swift
class AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA {}
```
```swift
struct myType {}
```
```swift
struct _MyType {}
```
```swift
private struct MyType_ {}
```
```swift
struct My {}
```
```swift
struct AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA {}
```
```swift
enum myType {}
```
```swift
enum _MyType {}
```
```swift
private enum MyType_ {}
```
```swift
enum My {}
```
```swift
enum AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA {}
```
```swift
typealias X = Void
```
```swift
private typealias Foo_Bar = Void
```
```swift
private typealias foo = Void
```
```swift
typealias AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA = Void
```
```swift
protocol Foo {
associatedtype X
}
```
```swift
protocol Foo {
associatedtype Foo_Bar: Equatable
}
```
```swift
protocol Foo {
associatedtype AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
}
```
</details>
## Unavailable Function
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`unavailable_function` | Disabled | No | idiomatic | No | 4.1.0
Unimplemented functions should be marked as unavailable.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
class ViewController: UIViewController {
@available(*, unavailable)
public required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
```
```swift
func jsonValue(_ jsonString: String) -> NSObject {
let data = jsonString.data(using: .utf8)!
let result = try! JSONSerialization.jsonObject(with: data, options: [])
if let dict = (result as? [String: Any])?.bridge() {
return dict
} else if let array = (result as? [Any])?.bridge() {
return array
}
fatalError()
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
class ViewController: UIViewController {
public required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
```
```swift
class ViewController: UIViewController {
public required init?(coder aDecoder: NSCoder) {
let reason = "init(coder:) has not been implemented"
fatalError(reason)
}
}
```
</details>
## Unneeded Break in Switch
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`unneeded_break_in_switch` | Enabled | No | idiomatic | No | 3.0.0
Avoid using unneeded break statements.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
switch foo {
case .bar:
break
}
```
```swift
switch foo {
default:
break
}
```
```swift
switch foo {
case .bar:
for i in [0, 1, 2] { break }
}
```
```swift
switch foo {
case .bar:
if true { break }
}
```
```swift
switch foo {
case .bar:
something()
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
switch foo {
case .bar:
something()
break
}
```
```swift
switch foo {
case .bar:
something()
break // comment
}
```
```swift
switch foo {
default:
something()
break
}
```
```swift
switch foo {
case .foo, .foo2 where condition:
something()
break
}
```
</details>
## Unneeded Parentheses in Closure Argument
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`unneeded_parentheses_in_closure_argument` | Disabled | Yes | style | No | 3.0.0
Parentheses are not needed when declaring closure arguments.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let foo = { (bar: Int) in }
```
```swift
let foo = { bar, _ in }
```
```swift
let foo = { bar in }
```
```swift
let foo = { bar -> Bool in return true }
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
call(arg: { (bar) in })
```
```swift
call(arg: { (bar, _) in })
```
```swift
let foo = { (bar) -> Bool in return true }
```
```swift
foo.map { ($0, $0) }.forEach { (x, y) in }
```
```swift
foo.bar { [weak self] (x, y) in }
```
```swift
[].first { (temp) in
[].first { (temp) in
[].first { (temp) in
_ = temp
return false
}
return false
}
return false
}
```
```swift
[].first { temp in
[].first { (temp) in
[].first { (temp) in
_ = temp
return false
}
return false
}
return false
}
```
</details>
## Untyped Error in Catch
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`untyped_error_in_catch` | Disabled | Yes | idiomatic | No | 3.0.0
Catch statements should not declare error variables without type casting.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
do {
try foo()
} catch {}
```
```swift
do {
try foo()
} catch Error.invalidOperation {
} catch {}
```
```swift
do {
try foo()
} catch let error as MyError {
} catch {}
```
```swift
do {
try foo()
} catch var error as MyError {
} catch {}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
do {
try foo()
} catch var error {}
```
```swift
do {
try foo()
} catch let error {}
```
```swift
do {
try foo()
} catch let someError {}
```
```swift
do {
try foo()
} catch var someError {}
```
```swift
do {
try foo()
} catch let e {}
```
```swift
do {
try foo()
} catch(let error) {}
```
```swift
do {
try foo()
} catch (let error) {}
```
</details>
## Unused Closure Parameter
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`unused_closure_parameter` | Enabled | Yes | lint | No | 3.0.0
Unused parameter in a closure should be replaced with _.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
[1, 2].map { $0 + 1 }
```
```swift
[1, 2].map({ $0 + 1 })
```
```swift
[1, 2].map { number in
number + 1
}
```
```swift
[1, 2].map { _ in
3
}
```
```swift
[1, 2].something { number, idx in
return number * idx
}
```
```swift
let isEmpty = [1, 2].isEmpty()
```
```swift
violations.sorted(by: { lhs, rhs in
return lhs.location > rhs.location
})
```
```swift
rlmConfiguration.migrationBlock.map { rlmMigration in
return { migration, schemaVersion in
rlmMigration(migration.rlmMigration, schemaVersion)
}
}
```
```swift
genericsFunc { (a: Type, b) in
a + b
}
```
```swift
var label: UILabel = { (lbl: UILabel) -> UILabel in
lbl.backgroundColor = .red
return lbl
}(UILabel())
```
```swift
hoge(arg: num) { num in
return num
}
```
```swift
({ (manager: FileManager) in
print(manager)
})(FileManager.default)
```
```swift
withPostSideEffect { input in
if true { print("\(input)") }
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
[1, 2].map { number in
return 3
}
```
```swift
[1, 2].map { number in
return numberWithSuffix
}
```
```swift
[1, 2].map { number in
return 3 // number
}
```
```swift
[1, 2].map { number in
return 3 "number"
}
```
```swift
[1, 2].something { number, idx in
return number
}
```
```swift
genericsFunc { (number: TypeA, idx: TypeB) in return idx
}
```
```swift
hoge(arg: num) { num in
}
```
```swift
fooFunc { ↓아 in
}
```
```swift
func foo () {
bar { number in
return 3
}
```
</details>
## Unused Enumerated
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`unused_enumerated` | Enabled | No | idiomatic | No | 3.0.0
When the index or the item is not used, `.enumerated()` can be removed.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
for (idx, foo) in bar.enumerated() { }
```
```swift
for (_, foo) in bar.enumerated().something() { }
```
```swift
for (_, foo) in bar.something() { }
```
```swift
for foo in bar.enumerated() { }
```
```swift
for foo in bar { }
```
```swift
for (idx, _) in bar.enumerated().something() { }
```
```swift
for (idx, _) in bar.something() { }
```
```swift
for idx in bar.indices { }
```
```swift
for (section, (event, _)) in data.enumerated() {}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
for (_, foo) in bar.enumerated() { }
```
```swift
for (_, foo) in abc.bar.enumerated() { }
```
```swift
for (_, foo) in abc.something().enumerated() { }
```
```swift
for (idx, _) in bar.enumerated() { }
```
</details>
## Unused Import
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`unused_import` | Disabled | Yes | lint | Yes | 3.0.0
All imported modules should be required to make the file compile.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
import Dispatch
dispatchMain()
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
import Dispatch
struct A {
static func dispatchMain() {}
}
A.dispatchMain()
```
```swift
import Foundation
dispatchMain()
```
</details>
## Unused Optional Binding
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`unused_optional_binding` | Enabled | No | style | No | 3.0.0
Prefer `!= nil` over `let _ =`
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
if let bar = Foo.optionalValue {
}
```
```swift
if let (_, second) = getOptionalTuple() {
}
```
```swift
if let (_, asd, _) = getOptionalTuple(), let bar = Foo.optionalValue {
}
```
```swift
if foo() { let _ = bar() }
```
```swift
if foo() { _ = bar() }
```
```swift
if case .some(_) = self {}
```
```swift
if let point = state.find({ _ in true }) {}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
if let _ = Foo.optionalValue {
}
```
```swift
if let a = Foo.optionalValue, let _ = Foo.optionalValue2 {
}
```
```swift
guard let a = Foo.optionalValue, let _ = Foo.optionalValue2 {
}
```
```swift
if let (first, second) = getOptionalTuple(), let _ = Foo.optionalValue {
}
```
```swift
if let (first, _) = getOptionalTuple(), let _ = Foo.optionalValue {
}
```
```swift
if let (_, second) = getOptionalTuple(), let _ = Foo.optionalValue {
}
```
```swift
if let (_, _, _) = getOptionalTuple(), let bar = Foo.optionalValue {
}
```
```swift
func foo() {
if let _ = bar {
}
```
```swift
if case .some(let _) = self {}
```
</details>
## Unused Private Declaration
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`unused_private_declaration` | Disabled | No | lint | Yes | 3.0.0
Private declarations should be referenced in that file.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
private let kConstant = 0
_ = kConstant
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
private let kConstant = 0
```
</details>
## Valid IBInspectable
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`valid_ibinspectable` | Enabled | No | lint | No | 3.0.0
@IBInspectable should be applied to variables only, have its type explicit and be of a supported type
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
class Foo {
@IBInspectable private var x: Int
}
```
```swift
class Foo {
@IBInspectable private var x: String?
}
```
```swift
class Foo {
@IBInspectable private var x: String!
}
```
```swift
class Foo {
@IBInspectable private var count: Int = 0
}
```
```swift
class Foo {
private var notInspectable = 0
}
```
```swift
class Foo {
private let notInspectable: Int
}
```
```swift
class Foo {
private let notInspectable: UInt8
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
class Foo {
@IBInspectable private let count: Int
}
```
```swift
class Foo {
@IBInspectable private var insets: UIEdgeInsets
}
```
```swift
class Foo {
@IBInspectable private var count = 0
}
```
```swift
class Foo {
@IBInspectable private var count: Int?
}
```
```swift
class Foo {
@IBInspectable private var count: Int!
}
```
```swift
class Foo {
@IBInspectable private var x: ImplicitlyUnwrappedOptional<Int>
}
```
```swift
class Foo {
@IBInspectable private var count: Optional<Int>
}
```
```swift
class Foo {
@IBInspectable private var x: Optional<String>
}
```
```swift
class Foo {
@IBInspectable private var x: ImplicitlyUnwrappedOptional<String>
}
```
</details>
## Vertical Parameter Alignment
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`vertical_parameter_alignment` | Enabled | No | style | No | 3.0.0
Function parameters should be aligned vertically if they're in multiple lines in a declaration.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
func validateFunction(_ file: File, kind: SwiftDeclarationKind,
dictionary: [String: SourceKitRepresentable]) { }
```
```swift
func validateFunction(_ file: File, kind: SwiftDeclarationKind,
dictionary: [String: SourceKitRepresentable]) -> [StyleViolation]
```
```swift
func foo(bar: Int)
```
```swift
func foo(bar: Int) -> String
```
```swift
func validateFunction(_ file: File, kind: SwiftDeclarationKind,
dictionary: [String: SourceKitRepresentable])
-> [StyleViolation]
```
```swift
func validateFunction(
_ file: File, kind: SwiftDeclarationKind,
dictionary: [String: SourceKitRepresentable]) -> [StyleViolation]
```
```swift
func validateFunction(
_ file: File, kind: SwiftDeclarationKind,
dictionary: [String: SourceKitRepresentable]
) -> [StyleViolation]
```
```swift
func regex(_ pattern: String,
options: NSRegularExpression.Options = [.anchorsMatchLines,
.dotMatchesLineSeparators]) -> NSRegularExpression
```
```swift
func foo(a: Void,
b: [String: String] =
[:]) {
}
```
```swift
func foo(data: (size: CGSize,
identifier: String)) {}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
func validateFunction(_ file: File, kind: SwiftDeclarationKind,
dictionary: [String: SourceKitRepresentable]) { }
```
```swift
func validateFunction(_ file: File, kind: SwiftDeclarationKind,
dictionary: [String: SourceKitRepresentable]) { }
```
```swift
func validateFunction(_ file: File,
kind: SwiftDeclarationKind,
dictionary: [String: SourceKitRepresentable]) { }
```
</details>
## Vertical Parameter Alignment On Call
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`vertical_parameter_alignment_on_call` | Disabled | No | style | No | 3.0.0
Function parameters should be aligned vertically if they're in multiple lines in a method call.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
foo(param1: 1, param2: bar
param3: false, param4: true)
```
```swift
foo(param1: 1, param2: bar)
```
```swift
foo(param1: 1, param2: bar
param3: false,
param4: true)
```
```swift
foo(
param1: 1
) { _ in }
```
```swift
UIView.animate(withDuration: 0.4, animations: {
blurredImageView.alpha = 1
}, completion: { _ in
self.hideLoading()
})
```
```swift
UIView.animate(withDuration: 0.4, animations: {
blurredImageView.alpha = 1
},
completion: { _ in
self.hideLoading()
})
```
```swift
foo(param1: 1, param2: { _ in },
param3: false, param4: true)
```
```swift
foo({ _ in
bar()
},
completion: { _ in
baz()
}
)
```
```swift
foo(param1: 1, param2: [
0,
1
], param3: 0)
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
foo(param1: 1, param2: bar
param3: false, param4: true)
```
```swift
foo(param1: 1, param2: bar
param3: false, param4: true)
```
```swift
foo(param1: 1, param2: bar
param3: false,
param4: true)
```
```swift
foo(param1: 1,
param2: { _ in })
```
```swift
foo(param1: 1,
param2: { _ in
}, param3: 2,
param4: 0)
```
```swift
foo(param1: 1, param2: { _ in },
param3: false, param4: true)
```
</details>
## Vertical Whitespace
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`vertical_whitespace` | Enabled | Yes | style | No | 3.0.0
Limit vertical whitespace to a single empty line.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let abc = 0
```
```swift
let abc = 0
```
```swift
/* bcs
*/
```
```swift
// bca
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
let aaaa = 0
```
```swift
struct AAAA {}
```
```swift
class BBBB {}
```
</details>
## Void Return
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`void_return` | Enabled | Yes | style | No | 3.0.0
Prefer `-> Void` over `-> ()`.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
let abc: () -> Void = {}
```
```swift
let abc: () -> (VoidVoid) = {}
```
```swift
func foo(completion: () -> Void)
```
```swift
let foo: (ConfigurationTests) -> () throws -> Void)
```
```swift
let foo: (ConfigurationTests) -> () throws -> Void)
```
```swift
let foo: (ConfigurationTests) ->() throws -> Void)
```
```swift
let foo: (ConfigurationTests) -> () -> Void)
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
let abc: () -> () = {}
```
```swift
let abc: () -> (Void) = {}
```
```swift
let abc: () -> ( Void ) = {}
```
```swift
func foo(completion: () -> ())
```
```swift
func foo(completion: () -> ( ))
```
```swift
func foo(completion: () -> (Void))
```
```swift
let foo: (ConfigurationTests) -> () throws -> ())
```
</details>
## Weak Delegate
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`weak_delegate` | Enabled | No | lint | No | 3.0.0
Delegates should be weak to avoid reference cycles.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
class Foo {
weak var delegate: SomeProtocol?
}
```
```swift
class Foo {
weak var someDelegate: SomeDelegateProtocol?
}
```
```swift
class Foo {
weak var delegateScroll: ScrollDelegate?
}
```
```swift
class Foo {
var scrollHandler: ScrollDelegate?
}
```
```swift
func foo() {
var delegate: SomeDelegate
}
```
```swift
class Foo {
var delegateNotified: Bool?
}
```
```swift
protocol P {
var delegate: AnyObject? { get set }
}
```
```swift
class Foo {
protocol P {
var delegate: AnyObject? { get set }
}
}
```
```swift
class Foo {
var computedDelegate: ComputedDelegate {
return bar()
}
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
class Foo {
var delegate: SomeProtocol?
}
```
```swift
class Foo {
var scrollDelegate: ScrollDelegate?
}
```
</details>
## XCTFail Message
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`xctfail_message` | Enabled | No | idiomatic | No | 3.0.0
An XCTFail call should include a description of the assertion.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
func testFoo() {
XCTFail("bar")
}
```
```swift
func testFoo() {
XCTFail(bar)
}
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
func testFoo() {
XCTFail()
}
```
```swift
func testFoo() {
XCTFail("")
}
```
</details>
## Yoda condition rule
Identifier | Enabled by default | Supports autocorrection | Kind | Analyzer | Minimum Swift Compiler Version
--- | --- | --- | --- | --- | ---
`yoda_condition` | Disabled | No | lint | No | 3.0.0
The variable should be placed on the left, the constant on the right of a comparison operator.
### Examples
<details>
<summary>Non Triggering Examples</summary>
```swift
if foo == 42 {}
```
```swift
if foo <= 42.42 {}
```
```swift
guard foo >= 42 else { return }
```
```swift
guard foo != "str str" else { return }
```
```swift
while foo < 10 { }
```
```swift
while foo > 1 { }
```
```swift
while foo + 1 == 2
```
```swift
if optionalValue?.property ?? 0 == 2
```
```swift
if foo == nil
```
</details>
<details>
<summary>Triggering Examples</summary>
```swift
if 42 == foo {}
```
```swift
if 42.42 >= foo {}
```
```swift
guard 42 <= foo else { return }
```
```swift
guard "str str" != foo else { return }
```
```swift
while 10 > foo { }
```
```swift
while 1 < foo { }
```
```swift
if nil == foo
```
</details>