슈프림 블로그
[iOS/Swift] XCode 프로젝트에 SwiftLint 적용하기 본문
SwiftLint
XCode 프로젝트에 Swift 코드 컨벤션을 잡아주는 SwiftLint를 적용하는 법을 알아보자.
일반적으로 Lint는 다른 언어에서도 소스코드를 분석하여 코드 스타일이나 프로그램 오류가 발생할 수 있는 부분을 찾아주는 도구로 활용된다. SwiftLint는 Swift 언어의 스타일 규칙에 맞지 않는 코드를 찾아내어 경고 또는 에러를 표시해주는 도구다. SwiftLint를 사용하면 프로그래머는 코드 스타일과 형식(규칙)에 집중하기보다는 더 좋은 성능과 효율에 집중하여 코드를 구현할 수 있게 된다.
SwiftLint Repository
사용 방법
- SwiftLint 설치
- Script 작성
- .swiftlint.yml 파일 생성
- Warning, Error 수정
1. SwiftLint 설치
문서에 나와있듯이, 먼저 Mac에 SwiftLint를 설치한다. Homebrew, Mint 등을 사용하여 설치할 수 있다.
2. Script 작성
Target
→ Build Phases
→ +
버튼 → New Run Script Phase
새로 생성된 Run Script에 다음 코드를 넣어준다.
if which swiftlint >/dev/null; then
swiftlint
else
echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi
Run Script의 이름을 SwiftLint Script 로 변경하고, 위치를 Complie Sources 위로 올려준다. 이렇게 하는 이유는, 컴파일 하기 전에 스크립트를 실행시켜 SwiftLint 룰 검사를 먼저 하는 것이 효율적이기 때문이다.
빌드를 해보면 수많은 Warning이 발생한 것을 확인할 수 있다. Default Rules를 모두 적용시킨 상태이기 때문이다!!
Default Rules는 이곳에서 Enabled by default 항목을 확인해보면 된다 :-)
3. .swiftlint.yml 파일 생성
위에서 발생한 Warning들은 기본적으로 생성된 파일이나 내가 손댈 수 없는 Podfile에도 적용된 상태이다. 제외시킬 파일이나 규칙은 제외하고, 팀 또는 프로젝트에서 정한 규칙대로만 검사하도록 하기 위해서는 별도의 Rule을 작성한 파일이 있어야 한다.
프로젝트에서 새로운 Empty 파일을 생성해준다. (프로젝트 폴더 아님 주의‼️)
이름은 무조건 .swiftlint.yml
로 만들어야 한다. 파일명이 .
으로 시작하므로 숨김파일로 처리된다.
disabled_rules:
Default Rules 중에 비활성화하고 싶은 규칙을 추가한다. 규칙 이름은 SwiftLintFramework Reference 에서 확인할 수 있다.
disabled_rules: # Default Rules에서 비활성화할 규칙
# 라인 뒤에 공백이 없어야 합니다. https://realm.github.io/SwiftLint/trailing_whitespace.html
- trailing_whitespace
# 강제 캐스팅은 피해야합니다. https://realm.github.io/SwiftLint/force_cast.html
- force_cast
# 강제 언래핑은 피해야합니다. https://realm.github.io/SwiftLint/force_unwrapping.html
- force_unwrapping
opt_in_rules:
기본적으로는 비활성화 되어있지만 활성화하고 싶은 규칙을 추가한다. SwiftLintFramework Reference
opt_in_rules:
# .count==0 보다는 .isEmpty를 사용하는 것이 좋습니다. https://realm.github.io/SwiftLint/empty_count.html
- empty_count
# 빈 String 문자열과 비교하는 것 보다는 .isEmpty를 사용하는 것이 좋습니다. https://realm.github.io/SwiftLint/empty_string.html
- empty_string
included:
SwiftLint 검사에서 포함할 파일 경로를 넣어준다.
excluded:
SwiftLint 검사에서 제외할 파일 경로들을 넣어준다. 나는 기본적으로 AppDelegate.swift
, SceneDelegate.swift
, Pods
는 제외시켜주는 편이다. included에 포함된 것 보다 우선적으로 처리된다.
excluded: # SwiftLint 검사에서 제외할 파일 경로
- Pods
- ProjectName/AppDelegate.swift
- ProjectName/SceneDelegate.swift
일부 규칙은 옵션을 지정할 수 있다.
#- 바이너리 규칙 -#
### warning으로 처리할 지 error로 처리할 지 그 레벨을 설정할 수 있습니다.
force_cast: warning # implicitly
force_try:
severity: warning # explicitly
#- warning, error 모두 있는 규칙 -#
### 한 줄로는 warning의 수준만 설정할 수 있습니다.
line_length: 110 # implicitly
### 배열을 사용해 warning과 error의 수준을 모두 설정할 수 있습니다.
type_body_length:
- 300 # warning, implicitly
- 400 # error, implicitly
file_length:
warning: 500 # explicitly
error: 1200 # explicitly
#- 네이밍 규칙 -#
### min_length 및 max_length에 대한 warning/error를 설정할 수 있습니다.
### 규칙에 제외되는 특수한 이름도 지정할 수 있습니다.
type_name:
min_length: 4 # only warning
max_length: # warning and error
warning: 40
error: 50
excluded: iPhone # excluded via string
allowed_symbols: ["_"] # these are allowed in type names
identifier_name:
min_length: # only min_length
error: 4 # only error
excluded: # excluded via string array
- id
- URL
- GlobalAPIKey
reporter: "xcode" # reporter type (xcode, json, csv, checkstyle, codeclimate, junit, html, emoji, sonarqube, markdown, github-actions-logging)
4. Warning, Error 수정
Lint 룰을 적용하고 빌드하면 경고와 오류들이 발생한다. 항상 commit을 올리기 전, Lint 오류들을 모두 해결하는 것이 바람직하다!
'iOS_Swift' 카테고리의 다른 글
[Swift/iOS] 소셜로그인 - Facebook Login (0) | 2021.05.11 |
---|---|
[Swift] 코딩테스트 보다가 열 받아서 정리하는 Swift 정규식 - NSRegularExpression (Regex) (1) | 2021.03.21 |
[iOS] 내 맥에 iPhone 연결하기 (iOS 개발/백업/Wi-Fi로 연결) (0) | 2021.02.12 |
[Swift] 구조체와 클래스 어떤 것을 선택해야 할까? (Apple 공식 Article) (0) | 2021.02.04 |
[iOS/Swift] HTTP/HTTPS 통신의 기본, URLSession (0) | 2020.12.29 |