이번 글은 SwiftLint를 적용하는 방법에 대해 알아보도록 하겠습니다.
SwiftLint란
SwiftLint란 스위프트 스타일 및 컨벤션을 강제하기 위한 도구로, Kodeco 스위프트 스타일 가이드에 대략적인 기반을 두고 있습니다.
협업을 진행할 때, 컨벤션을 정하고 이를 준수하기 위해 코드 리뷰 등을 진행하지만, 컨벤션에 맞지 않는 경우가 생길 수 있습니다. 이러한 경우를 위해 SwiftLint를 사용하면, 컨벤션에 맞지 않는 부분을 알려주기 때문에 컨벤션을 지키는데 도움을 줍니다.
SwiftLint 사용하기
1. SwiftLint 설치하기
우선 SwiftLint를 사용하기 위해선 SwiftLint를 설치해주어야 합니다. brew로 설치할 수도 있고, cocoapods로 프로젝트 자체에 추가해서 사용할 수도 있지만, 불필요한 cocoapods 디펜던시를 추가할 필요가 없기 때문에, brew를 통해 설치하는 것을 권장드립니다.
brew install swiftlint
2. Xcode에 SwiftLint 추가하기
설치를 진행하였으면, Xcode를 실행하여 [Targets] -> [Build Phases] -> '+' 버튼 -> [New Run Script Phase]을 클릭하고,
다음과 같이 코드를 입력해줍니다.


export PATH="$PATH:/opt/homebrew/bin"
if which swiftlint >/dev/null; then
swiftlint
else
echo "[warning] SwiftLint not installed, download using `brew install swiftlint`"
fi
3. 스크립트 이름 및 위치 변경
해당 스크립트의 이름을 SwiftLint로 변경해주고, 드래그를 통해 Compile Sources 윗부분에 위치시켜줍니다. 위치를 옮기는 이유는 컴파일을 하기 전에 SwiftLint 검사를 진행하는 것이 더욱 효율적이기 때문입니다.

4. .swiftlint.yml 파일 생성
그 다음은 .swiftlint.yml 파일을 생성할 차례입니다.
사실 해당 파일을 생성하지 않아도 동작하지만, 해당 파일이 없다면 기본 설정으로 되어있는 기준에 맞춰 검사를 진행합니다.
따라서 팀이 정한 컨벤션의 규칙을 적용시키기 위해서는 별도의 규칙을 저장할 파일이 있어야하는데, 해당 파일이 .swiftlint.yml입니다.
[프로젝트] -> [New File] -> [Empty] 파일을 선택해줍니다.
여기서 Empty 파일은 User Interface에 있는 것도 되고 Others에 있는 Empty도 되니 상관없습니다.
(다른 블로그에서는 User Interface에 있는 Empty 파일로 진행하였고, 저는 Others에 있는 Empty 파일로 진행했는데, 문제가 없었습니다.)
해당 파일의 이름을 무조건 .swiftlint.yml로 만들어야 한다고 합니다. 앞에 .을 붙여주어 파일을 숨겨줍니다.

5. 규칙 설정
다음은 규칙을 설정해주어야 합니다.
규칙의 이름들은 SwiftLintCore Reference > Rule Directory Reference에서 확인하실 수 있습니다.
disabled_rules : 기본 규칙 중 비활성화하고 싶은 규칙을 추가할 수 있습니다.
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 : 기본 규칙은 아니지만 활성화하고 싶은 규칙을 추가할 수 있습니다.
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 검사에서 제외할 파일 경로를 추가해줄 수 있습니다. 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
SwiftLint 적용 및 에러 수정
이제 규칙에 벗어난 형식이나 코드가 있다면, 빌드를 할 때 경고문이 나타나거나, 에러가 나타납니다.
다음은 파일 길이 관련 경고문인데, body가 250줄을 넘기면 나타나는 경고문입니다.

commit을 올리기 전에 경고문들을 수정한 뒤!! 올리는 것이 바람직하겠죠?
'iOS' 카테고리의 다른 글
[iOS] Xcode의 빌드 과정 (0) | 2025.01.16 |
---|---|
[UIKit] UILabel.text와 문자열 보간법의 옵셔널 표현의 차이 (0) | 2025.01.03 |
[iOS] 협업 시 하나의 Bundle Identifier로 설정하기 (Provisioning Profile, Certificate 공유) (0) | 2023.11.21 |
[iOS] Firebase FCM을 이용한 서버 푸시 구현 (4) | 2023.11.15 |
[iOS] UserNotification을 사용하여 로컬 알림 만들기 (0) | 2023.10.03 |
이번 글은 SwiftLint를 적용하는 방법에 대해 알아보도록 하겠습니다.
SwiftLint란
SwiftLint란 스위프트 스타일 및 컨벤션을 강제하기 위한 도구로, Kodeco 스위프트 스타일 가이드에 대략적인 기반을 두고 있습니다.
협업을 진행할 때, 컨벤션을 정하고 이를 준수하기 위해 코드 리뷰 등을 진행하지만, 컨벤션에 맞지 않는 경우가 생길 수 있습니다. 이러한 경우를 위해 SwiftLint를 사용하면, 컨벤션에 맞지 않는 부분을 알려주기 때문에 컨벤션을 지키는데 도움을 줍니다.
SwiftLint 사용하기
1. SwiftLint 설치하기
우선 SwiftLint를 사용하기 위해선 SwiftLint를 설치해주어야 합니다. brew로 설치할 수도 있고, cocoapods로 프로젝트 자체에 추가해서 사용할 수도 있지만, 불필요한 cocoapods 디펜던시를 추가할 필요가 없기 때문에, brew를 통해 설치하는 것을 권장드립니다.
brew install swiftlint
2. Xcode에 SwiftLint 추가하기
설치를 진행하였으면, Xcode를 실행하여 [Targets] -> [Build Phases] -> '+' 버튼 -> [New Run Script Phase]을 클릭하고,
다음과 같이 코드를 입력해줍니다.


export PATH="$PATH:/opt/homebrew/bin"
if which swiftlint >/dev/null; then
swiftlint
else
echo "[warning] SwiftLint not installed, download using `brew install swiftlint`"
fi
3. 스크립트 이름 및 위치 변경
해당 스크립트의 이름을 SwiftLint로 변경해주고, 드래그를 통해 Compile Sources 윗부분에 위치시켜줍니다. 위치를 옮기는 이유는 컴파일을 하기 전에 SwiftLint 검사를 진행하는 것이 더욱 효율적이기 때문입니다.

4. .swiftlint.yml 파일 생성
그 다음은 .swiftlint.yml 파일을 생성할 차례입니다.
사실 해당 파일을 생성하지 않아도 동작하지만, 해당 파일이 없다면 기본 설정으로 되어있는 기준에 맞춰 검사를 진행합니다.
따라서 팀이 정한 컨벤션의 규칙을 적용시키기 위해서는 별도의 규칙을 저장할 파일이 있어야하는데, 해당 파일이 .swiftlint.yml입니다.
[프로젝트] -> [New File] -> [Empty] 파일을 선택해줍니다.
여기서 Empty 파일은 User Interface에 있는 것도 되고 Others에 있는 Empty도 되니 상관없습니다.
(다른 블로그에서는 User Interface에 있는 Empty 파일로 진행하였고, 저는 Others에 있는 Empty 파일로 진행했는데, 문제가 없었습니다.)
해당 파일의 이름을 무조건 .swiftlint.yml로 만들어야 한다고 합니다. 앞에 .을 붙여주어 파일을 숨겨줍니다.

5. 규칙 설정
다음은 규칙을 설정해주어야 합니다.
규칙의 이름들은 SwiftLintCore Reference > Rule Directory Reference에서 확인하실 수 있습니다.
disabled_rules : 기본 규칙 중 비활성화하고 싶은 규칙을 추가할 수 있습니다.
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 : 기본 규칙은 아니지만 활성화하고 싶은 규칙을 추가할 수 있습니다.
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 검사에서 제외할 파일 경로를 추가해줄 수 있습니다. 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
SwiftLint 적용 및 에러 수정
이제 규칙에 벗어난 형식이나 코드가 있다면, 빌드를 할 때 경고문이 나타나거나, 에러가 나타납니다.
다음은 파일 길이 관련 경고문인데, body가 250줄을 넘기면 나타나는 경고문입니다.

commit을 올리기 전에 경고문들을 수정한 뒤!! 올리는 것이 바람직하겠죠?
'iOS' 카테고리의 다른 글
[iOS] Xcode의 빌드 과정 (0) | 2025.01.16 |
---|---|
[UIKit] UILabel.text와 문자열 보간법의 옵셔널 표현의 차이 (0) | 2025.01.03 |
[iOS] 협업 시 하나의 Bundle Identifier로 설정하기 (Provisioning Profile, Certificate 공유) (0) | 2023.11.21 |
[iOS] Firebase FCM을 이용한 서버 푸시 구현 (4) | 2023.11.15 |
[iOS] UserNotification을 사용하여 로컬 알림 만들기 (0) | 2023.10.03 |