[iOS] SwiftLint Opt-in Rules
옵션 룰
Accessibility Label for Image
- 모든 이미지는 accessibility label을 가져야 한다.
- Tap gesture가 있는 모든 View들은 .isButton accessibility trait를 포함해야한다.
Anonymous Argument in Multiline Closure
- 여러 줄의 closure에서 이름 있는 arguments 사용하기
AnyObject Protocol
- class-only protocol에서는 클래스보다 AnyObject 사용하기
Array Init
Array(seq)
를 seq.map { $0 }를 통해 array로 변환하는 것 보다 선호
Attributes
- attribues는 함수, 타입에서는 따로, 변수, import에서는 같은 줄에 사용
Balanced XCTest life-cycle
- Test 클래스는 균형잡힌 setUp, tearDown 메소드를 반드시 구현해야한다.
Capture Variable
- 상수가 아닌 변수가 closure에서 capture되면 안된다.
Closure Body Length
- 클로저는 너무 길면 안된다.
- 20줄 warning, 100줄 error
Closure End Indentation
- 클로저 닫을 때는 처음과 같은 indent여야함.
Closure Spacing
Collection Element Alignment
- collection의 요소들은 vertical 정렬되어야함
Comma Inheritance Rule
Conditional Retruns on Newline
- 조건문은 항상 다음 줄에서 return되어야함
Contains Over Filter Count
contains
를 filter(where: ).count
보다 선호
Contains Over Filter Is Empty
contains
를 filter(where: ).isEmpty
보다 선호
Contains over first not nil
contains
를 first(where: ) != nil
, firstIndex(where: ) != nil
보다
Contains over range(of:) comparison to nil
contains
를 range(of:) != nil
, range(of: ) == nil
보다 선호
Convenience Type
- 하나의 static member를 위해서는 caseless enum을 사용하기
Discarded Notification Center Observer
- When registering for a notification using a block, the opaque observer that is returned should be stored so it can be removed later.
Discouraged Assert
assertionFailure()
, preconditionFailure()
를 assert(false)
보다 선호
Discouraged None Name
- case나 static 멤버 이름으로 none 사용하지 말기
Discouraged Object Literal
- initializer를 object literal 보다 선호
Discouraged Optional Boolean
- bool에서는 optional보다 non optional 선호
Discouraged Optional Collection
- 빈 cillection을 optional collection보다 선호
Empty Collection Literal
- collection에서 ==, != 사용보다 isEmpty 사용하기
Empty Count
- count == 0 말고 isEmpty 사용하기
Empty String
Empty XCTest Method
Enum Case Associated Values Count
- enum case에서 연관값은 적어야함
- 5개 warning, 6개 error
Expiring Todo
- TODOs, FIXMEs는 기한 내에 expire 되어야함.
Explicit ACL
Explicit Enum Raw Value
- 명시적으로 enum의 raw value 작성해야함
Explicit Init
- 명시적으로 .init()을 호출하는 것은 지양
Explicit Self
- 인스턴스 변수와 함수는 명시적으로 self를 쓴 후에 접근
Explicit Top Level ACL
- top-level 선언에서는 ACL 무조건 작성하기
Explicit Type Interface
Extension Access Modifier
- Prefer to use extension access modifiers
Fallthrough
Fatal Error Message
- 헤더 comments는 프로젝트 패턴과 동일해야함
File Name
- 파일 이름은 파일에 선언된 타입이나 extension과 같아야함
File Name No Space
File Types Order
First Where
- collection에서
.first(where: )
를 .filter { }.first
보다 선호
FlatMap over map and reduce
- map하고 reduce하지말고 flatMap 사용하기
Force Unwrapping
Function Default Parameter at End
- Prefer to locate parameters with defaults toward the end of the parameter list.
IBInspectable in Extension
- extension에는 @IBInspectable 프로퍼티를 추가하면 안됨
Identical Operands
If-let Shadowing
- 옵셔널 바인딩할 때 shorthand syntax 사용하기
Implicit Return
- closure, functions, getter에서 implicit return 선호
Implicitly Unwrapped Optional
- 암시적으로 unwrapped optionals는 지양 (IBOutlet들은 예외)
Indentation Width
- 첫째줄은 indent 금지, 기본 4칸의 indent
Joined Default Paramter
- 기본 seperator를 사용한 joined는 할 필요 없음
Last Where
- collection에서
.last(where:)
를 .filter { }.last
보다 선호
Legacy Multiple
isMultiple(of:)
를 %
연산보다 선호
Legacy Objective-C Reference Type
- Prefer Swift value types to bridged Objective-C reference types
Variable Declaration Whitespace
- let, var들은 다른 statements와 한 칸 띄워야 함
Literal Expression End Indentation
- 배열, dictionary의 마지막 indentation은 처음과 같아야함
Lower ACL than parent
Missing Docs
Modifier Order
- Modifier의 순서는 일정해야함 (override, acl, setterACL, dynamic, mutators, lazy, final, required, convenience, typeMethods, owned 순서)
Multiline Arguments
- arguments들은 한 줄에 있거나 한 줄에 하나씩 있어야함
Multiline Arguments Brackets
- multiline일 때 brackets들은 다른 줄에 적기
Multiline Function Chains
- function들을 chain할 때 한 줄에 다 쓰거나 한줄에 하나씩 쓰기
Multiline Literal Brackets
- Multiline literals들은 다른 줄에 brackets들로 감싸져야함
Multiline Parameters
- 함수, 메소드들의 parameters들은 한 줄에 있거나 한 줄에 하나씩 있어야함
Multiline Parameters Brackets
- Multiline parameters들은 다른 줄에 brackets들로 감싸져야함
Nimble Operator
- Prefer Nimble operator overloads over free matcher functions.
No Extension Access Modifier
- extension에서는 access modifier 사용 금지
No Grouping Extension
- extension은 같은 source file내의 코드를 group하는데 사용하면 안된다.
NSLocalizedString Key
- Static strings should be used as key/comment in NSLocalizedString in order for genstrings to work.
NSLocalizedString Require Bundle
- Calls to NSLocalizedString should specify the bundle which contains the strings file.
Number Separator
- 큰 정수에는 0 3개마다 underscore로 구분하기
Object Literal
- object literals를 image, color init보다 선호
Operator Usage Whitespace
Optional Enum Case Match
- Matching an enum case against an optional enum without ‘?’ is supported on Swift 5.1 and above.
Overridden methods call super
- overridden methods들은 항상 super를 호출해야함
Override in Extension
- extension은 선언을 override하면 안됨
Pattern Matching Keywords
- tuple 밖으로 keyword를 빼서 한번에 매칭하기
Prefer Nimble
- Prefer Nimble matchers over XCTAssert functions.
Prefer Self in Static References
- static reference는 클래스 이름보다 self를 이용해서 prefixed되어야함
Prefer Self Type Over Type of Self
Self
를 type(of: self)
보다 선호
Prefer Zero Over Explicit Init
.zero
를 CGPoint(x: 0, y: 0)
와 같은 것들보다 선호
Prefixed Top-Level Constant
- top-level의 constants들은 k로 시작해야함
Private Actions
Private Outlets
Private Combine Subject
- Combine Subject는 private이어야 함
Prohibited Interface Builder
- Interface Builder를 통해 view를 생성하는 것은 지양
Prohibited calls to super
- 어떤 methods들은 super를 호출하면 안됨
Quick Discouraged Call
- Discouraged call inside ‘describe’ and/or ‘context’ block.
Quick Discouraged Focused Test
- Discouraged focused test. Other tests won’t run while this one is focused.
Quick Discouraged Pending Test
- Discouraged pending test. This test won’t run while it’s marked as pending.
Raw Value For Camel Cased Codable Enum
- camel cased의 case들은 raw value를 가져야함
Reduce Into
reduce(into:_:)
를 reduce(_:_:)
보다 선호
Redundant Nil Coalescing
- nil coalescing operator is only evaluated if the lhs is nil, coalescing operator with nil as rhs is redundant
Redundant Type Annotation
- 변수들은 필요없는 type annotation을 가질 필요 없음
Required Deinit
Required Enum Case
- 특정한 protocol을 채택하는 enum은 특정 case를 필수적으로 구현해야함
Return Value from Void Function
- void function에서 value return하지 말기
Self Binding
- self binding 시 같은 이름 사용하기
Single Test Class
- Test files should contain a single QuickSpec or XCTestCase class.
Min or Max over Sorted First or Last
min()
, max()
를 sorted().first
, sorted().last
보다 선호
Sorted Imports
Static Operator
- operators는 static으로 선언되어야 함
Strict fileprivate
Strong IBOutlet
- @IBOutlets는 weak로 선언되면 안됨
Swtich Case on Newline
- case후 statements들은 항상 새로운 줄에 작성
Test case accessibility
- Test cases should only contain private non-test members.
Toggle Bool
someBool.toggle()
을 someBool = !someBool
보다 선호
Trailing Closure
- 가능한 trailing closure 사용하기
Type Contents Order
- subtypes, properties, methods 등등의 순서 정의하고 따르기
Type-safe Array Init
Unavailable Function
- Unimplemented functions should be marked as unavailable.
Unneeded Parentheses in Closure Argument
- closure의 arguments들에 대해서는 parentheses를 사용할 필요 없음
Unowned Variable Capture
Untyped Error in Catch
- catch에서 error는 타입캐스팅 없이 선언하면 안됨
Unused Declaration
Unused Import
Vertical Parameter Alignment On Call
- 함수 parameters들은 한 줄, 또는 vertical 정렬되어서 호출되어야 함
Vertical Whitespace Between Cases
Vertical Whitespace before Closing Braces
- closing brace 전에 빈 줄 없이 하기
Vertical Whitespace after Opening Braces
- opening brace 후에 빈 줄 없이 하기
Weak Delegate
- delegate은 weak으로 선언하여 순환 참조 피하기
XCTest Specific Matcher
- Prefer specific XCTest matchers over XCTAssertEqual and XCTAssertNotEqual
Yoda conditaion rule
- constant literal은 비교 연산자의 오른쪽에 위치하도록 하기
Reference
SwiftLint Rules