[iOS] SwiftLint는 무엇일까
SwiftLint
- Swift 코드 스타일과 관려된 정적 분석 도구
SwiftLint를 사용하는 이유는?
개발자마다 코딩 스타일은 다르지만, 코딩 표준이라고도 불리는 코딩 컨벤션은 코드를 작성할 때 추천하는 코딩 스타일, 좋은 사례등을 모아놓은 가이드라인이다.
협업을 하다 보면 서로 다른 코드 스타일로 인해 코드의 가독성이 떨어지는 경우가 발생하기 마련이고 이럴때 SwiftLint를 사용하면 Swift언어에서 규칙에 어긋나는 코드를 찾아내서 경고 or 에러를 반환해 주기 때문에 일고나된 코드 스타일을 유지하고 코드 품질을 향상시킬 수 있다!
사용법
- CocoaPods을 통해 SwiftLint를 설치
pod 'SwiftLint'
-
적용하려면 TARGETS -> Build Phases에서 좌측 상단의 + 버튼을 클릭하여 New Run Scipt Phase를 선택하면 Run Script가 추가된 것을 확인 가능
-
Run Script의 Shell 뒤 이름을 SwiftLint로 변경하고 주석 아래에 스크립트를 입력
${PODS_ROOT}/SwiftLint/swiftlint
- 적용은 완료되었고 SwiftLint가 적용되어 규칙에 맞지않다는 수많은 경고문이 등장 -> 하나하나 수정 필요 (수정이 귀찮으면 script에서 autocorrect를 붙여주자!)
규칙 커스텀
SwiftLintsms 스타일에 맞게 규칙을 커스텀 할 수 있으므로 필요에 따라 진행하면 된다.
Rule 공식문서에는 다양한 규칙들의 식별자(rule 설정에 필요), default 설정 여부, 자동수정 여부, 최소 Swift Compiler 버전과 같은 다양한 사항이 명시되어 있다.
// 공식문서 예시
disabled_rules: # 실행에서 제외할 룰 식별자들
- colon
- comma
- control_statement
opt_in_rules: # 일부 룰은 옵트 인 형태로 제공
- empty_count
- missing_docs
# 사용 가능한 모든 룰은 swiftlint rules 명령으로 확인 가능
included: # 린트 과정에 포함할 파일 경로. 이 항목이 존재하면 `--path`는 무시됨
- Source
excluded: # 린트 과정에서 무시할 파일 경로. `included`보다 우선순위 높음
- Carthage
- Pods
- Source/ExcludedFolder
- Source/ExcludedFile.swift
# 설정 가능한 룰은 이 설정 파일에서 커스터마이징 가능
# 경고나 에러 중 하나를 발생시키는 룰은 위반 수준을 설정 가능
force_cast: warning # 암시적으로 지정
force_try:
severity: warning # 명시적으로 지정
# 경고 및 에러 둘 다 존재하는 룰의 경우 값을 하나만 지정하면 암시적으로 경고 수준에 설정됨
line_length: 110
# 값을 나열해서 암시적으로 양쪽 다 지정할 수 있음
type_body_length:
- 300 # 경고
- 400 # 에러
# 둘 다 명시적으로 지정할 수도 있음
file_length:
warning: 500
error: 1200
# 네이밍 룰은 경고/에러에 min_length와 max_length를 각각 설정 가능
# 제외할 이름을 설정할 수 있음
type_name:
min_length: 4 # 경고에만 적용됨
max_length: # 경고와 에러 둘 다 적용
warning: 40
error: 50
excluded: iPhone # 제외할 문자열 값 사용
identifier_name:
min_length: # min_length에서
error: 4 # 에러만 적용
excluded: # 제외할 문자열 목록 사용
- id
- URL
- GlobalAPIKey
reporter: "xcode" # 보고 유형 (xcode, json, csv, checkstyle, junit, html, emoji, markdown)
커스텀 룰 또한 다음과 같이 정의할 수 있기 떄문에 자유로운 코딩 컨벤션이 가능하다.
custom_rules:
pirates_beat_ninjas: # 룰 식별자
included: ".*.swift" # 린트 실행시 포함할 경로를 정의하는 정규표현식. 선택 가능.
name: "Pirates Beat Ninjas" # 룰 이름. 선택 가능.
regex: "([n,N]inja)" # 패턴 매칭
match_kinds: # 매칭할 SyntaxKinds. 선택 가능.
- comment
- identifier
message: "Pirates are better than ninjas." # 위반 메시지. 선택 가능.
severity: error # 위반 수준. 선택 가능.
no_hiding_in_strings:
regex: "([n,N]inja)"
match_kinds: string
사용법
- .swiftlint.yml 이라는 Empty 파일을 만들어주고 경고 창에서 use”.” 클릭
- https://realm.github.io/SwiftLint/rule-directory.html 에서 원하는 규칙을 확인하고 적용
댓글남기기