Function filter
has a Cognitive Complexity of 24 (exceeds 5 allowed). Consider refactoring. Open
internal func filter(predicate: NSPredicate) -> AnyRandomAccessCollection<Iterator.Element> {
#if !os(watchOS)
if let (_, keyPathConstantTuple, constantValue) = tupleMKShape(predicate: predicate) {
if let circle = constantValue as? MKCircle {
let center = CLLocation(latitude: circle.coordinate.latitude, longitude: circle.coordinate.longitude)
- Read upRead up
Cognitive Complexity
Cognitive Complexity is a measure of how difficult a unit of code is to intuitively understand. Unlike Cyclomatic Complexity, which determines how difficult your code will be to test, Cognitive Complexity tells you how difficult your code will be to read and comprehend.
A method's cognitive complexity is based on a few simple rules:
- Code is not considered more complex when it uses shorthand that the language provides for collapsing multiple statements into one
- Code is considered more complex for each "break in the linear flow of the code"
- Code is considered more complex when "flow breaking structures are nested"
Further reading
Function filter
has 46 lines of code (exceeds 25 allowed). Consider refactoring. Open
internal func filter(predicate: NSPredicate) -> AnyRandomAccessCollection<Iterator.Element> {
#if !os(watchOS)
if let (_, keyPathConstantTuple, constantValue) = tupleMKShape(predicate: predicate) {
if let circle = constantValue as? MKCircle {
let center = CLLocation(latitude: circle.coordinate.latitude, longitude: circle.coordinate.longitude)
Avoid too many return
statements within this function. Open
return false
Avoid too many return
statements within this function. Open
return self
Avoid too many return
statements within this function. Open
return path.contains(CGPoint(x: geoPoint.latitude, y: geoPoint.longitude))
Closure is the function's final argument and may be passed as a trailing closure instead Open
return AnyRandomAccessCollection(filter({ (item) -> Bool in
- Read upRead up
- Exclude checks
trailing-closure
Closures that are the last argument of a function should be passed into the function using trailing closure syntax.
Preferred
reversed = names.sort { s1, s2 in return s1 > s2 }
Not Preferred
reversed = names.sort({ s1, s2 in return s1 > s2 })
If statement should not have any line breaks before the opening brace Open
{
- Read upRead up
- Exclude checks
brace-style
Definitions of
- class
- struct
- function
- Control flow constructs (if
, else if
, else
, switch
, for
, while
, repeat-while
)
- init
- protocol
- enum
- closure
- Getters and Setters (set
, get
)
- extension
should follow the One True Brace Style (1TBS): each construct has its opening brace one the same line along with the same indentation level as its header, the statements within the braces are indented, and the closing brace at the end is on the same indentation level as the header of the function at a line of its own. Braces are not omitted for a control statement with only a single statement in its scope. Every opening brace must also have one space preceding it.
Classes
Preferred
class SomeClass {
}
class SomeClass: SomeSuperClass {
}
Not Preferred
class SomeClass
{
}
class SomeClass: SomeSuperClass{
}
Structs
Preferred
struct SomeStruct {
}
struct SomeStruct : SomeParentStruct {
}
Not Preferred
struct SomeStruct
{
}
struct SomeStruct : SomeParentStruct {
}
Functions
Preferred
func someMethod() {
}
func someOtherFunction () -> () {
}
Not Preferred
func someMethod()
{
}
func someOtherFunction () -> ()
{
}
Control flow constructs
- if, else if, and else statement
Preferred
if SomeCondition {
} else if someOtherCondition {
} else {
}
Not Preferred
if SomeCondition
{
}
else if someOtherCondition
{
}
else
{
}
- switch statement
Preferred
switch SomeData {
default:
break
}
Not Preferred
switch SomeData
{
default:
break
}
- for loop
Preferred
for var i = 0; i < 10; i+=1 {
}
Not Preferred
for var i = 0; i < 10; i+=1
{
}
- while loop
Preferred
while SomeCondition {
}
Not Preferred
while SomeCondition
{
}
- repeat-while loop
Preferred
repeat {
} while SomeCondition
Not Preferred
repeat
{
} while SomeCondition
Initializers
Preferred
init(someParameter:Double, someOtherParameter:Double) {
self.someMember = someParameter
self.someOtherMember = someOtherParameter
}
Not Preferred
init(someParameter:Double, someOtherParameter:Double)
{
self.someMember = someParameter
self.someOtherMember = someOtherParameter
}
Protocols
Preferred
protocol SomeProtocol {
}
protocol SomeOtherProtocol : X {
}
Not Preferred
protocol SomeProtocol
{
}
protocol SomeOtherProtocol : X
{
}
Enums
Preferred
enum SomeEnum {
case A, B, C, D
}
enum SomeEnum {
case A
case B
case C
case D
}
enum SomeEnum: Int {
case A, B, C = 5, D
}
Not Preferred
enum SomeEnum
{
case A, B, C, D
}
enum SomeEnum
{
case A
case B
case C
case D
}
enum SomeEnum: Int
{
case A, B, C = 5, D
}
Closures
Preferred
func someFunction () -> () {
// closure
}
Not Preferred
func someFunction () -> ()
{
// closure
}
Setters and Getters
- set
Preferred
set {
oldValue = newValue / 2
}
Not Preferred
set
{
oldValue = newValue / 2
}
- get
Preferred
get {
return value * 2
}
Not Preferred
get
{
return value * 2
}
Extensions
Preferred
extension someExtension {
}
Not Preferred
extension someExtension
{
}
Function should have at least one blank line after it Open
}
- Read upRead up
- Exclude checks
function-whitespace
Every function and method declaration should have one blank line before and after itself. An exception to this rule are functions that are declared at the start of a file (only need one blank line after their declaration) or at the end of a file (only need one blank line before their declaration). Comments immediately before a function declaration (no blank lines between them and the function) are considered to be part of the declaration.
Preferred
func function1() {
var text = 1
var text = 2
}
function1()
// a comment
func function2() {
// something goes here
}
struct SomeStruct {
func function3() {
// something goes here
}
func function4() {
// something else goes here
};
}
func function5() {
// something goes here
}
Not Preferred
func function1() {
var text = 1
var text = 2
}
function1()
// a comment
func function2() {
// something goes here
}
struct SomeStruct {
func function3() {
// something goes here
}
func function4() {
// something else goes here
};
}
func function5() {
// something goes here
}
Line should not have any trailing whitespace Open
- Read upRead up
- Exclude checks
trailing-whitespace
Flag whitespace after the last non-whitespace character on each line until the newline.
Preferred
let number = 42¬
Not Preferred
let number = 42••¬
Function should have at least one blank line before it Open
internal func tupleMKShape(predicate: NSPredicate) -> (NSComparisonPredicate, (keyPathExpression: NSExpression, constantValueExpression: NSExpression), Any)? {
- Read upRead up
- Exclude checks
function-whitespace
Every function and method declaration should have one blank line before and after itself. An exception to this rule are functions that are declared at the start of a file (only need one blank line after their declaration) or at the end of a file (only need one blank line before their declaration). Comments immediately before a function declaration (no blank lines between them and the function) are considered to be part of the declaration.
Preferred
func function1() {
var text = 1
var text = 2
}
function1()
// a comment
func function2() {
// something goes here
}
struct SomeStruct {
func function3() {
// something goes here
}
func function4() {
// something else goes here
};
}
func function5() {
// something goes here
}
Not Preferred
func function1() {
var text = 1
var text = 2
}
function1()
// a comment
func function2() {
// something goes here
}
struct SomeStruct {
func function3() {
// something goes here
}
func function4() {
// something else goes here
};
}
func function5() {
// something goes here
}
Line should not have any trailing whitespace Open
- Read upRead up
- Exclude checks
trailing-whitespace
Flag whitespace after the last non-whitespace character on each line until the newline.
Preferred
let number = 42¬
Not Preferred
let number = 42••¬
Closure is the function's final argument and may be passed as a trailing closure instead Open
return AnyRandomAccessCollection(filter({ (item) -> Bool in
- Read upRead up
- Exclude checks
trailing-closure
Closures that are the last argument of a function should be passed into the function using trailing closure syntax.
Preferred
reversed = names.sort { s1, s2 in return s1 > s2 }
Not Preferred
reversed = names.sort({ s1, s2 in return s1 > s2 })