-
[iOS] SwiftLint ์ ์ฉํ๊ธฐiOS 2022. 5. 10. 16:59
SwiftLint๋?
SwiftLint๋ ์ฝ๋์ ์คํ์ผ ์ค๋ฅ๋ฅผ ํ์ํ๋๋ฐ ๋์์ด ๋๋ ์ ์ํ ์ฝ๋ ์คํ์ผ ๋ถ์ ๋๊ตฌ์ด๋ค.
์คํ์ผ์ ๋ฐ๋ฅด์ง ์์ ๋, ๋น๋๋ฅผ ์คํจ๋ก ํ์ํ๊ฑฐ๋ ๊ฒฝ๊ณ ๋ฅผ ํ์ํ์ฌ ์คํ์ผ์ ์ ์ฉํ๋๋ฐ ๋์์ ์ค๋ค.
1. ์ฝ์ฝ์ํ ์ค์นํ๊ธฐ
pod 'SwiftLint'2. Script ์ถ๊ฐํ๊ธฐ
Target → Build Phase → + → New Run Script Phase

Run Script์ ์๋ ์ฝ๋๋ฅผ ์ถ๊ฐํ๋ค.
${PODS_ROOT}/SwiftLint/swiftlint
๊ทธ๋ฆฌ๊ณ Run Script ์ด๋ฆ์ SwiftLint Script๋ก ๋ณ๊ฒฝํ๋ค.
๊ทธ๋ฆฌ๊ณ ์์น๋ฅผ Compile Sources ์๋ก ์ฌ๋ ค์ฃผ์๋ค!
์ด๋ ๊ฒ ํ๋ฉด, ์ปดํ์ผ ์ ์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํด์ SwiftLint ๋ฃฐ ๊ฒ์ฌ๋ฅผ ๋จผ์ ์งํํ๋ค๊ณ ํ๋ค.

๊ทธ๋ฆฌ๊ณ ๋น๋๋ฅผ ์งํํ๋ฉด!
์ด๋ ๊ฒ ๋ง์ Warning๋ค์ด ์๊ฒจ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.

์ง๊ธ์ ์ง์ ๋ด๊ฐ ์์ฑํ ๊ฒ์ด ์๋, Default Rules๋ฅผ ๋ชจ๋ ์ ์ฉ์ํจ ์ํ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ ๋ง์ ๊ฒฝ๊ณ ๋ค์ ๋ณผ ์ ์๋ค.
Default Rules๋ ์ฌ๊ธฐ์ ํ์ธ ๊ฐ๋ฅ!
3. SwiftLint ์ฌ์ฉํ๊ธฐ
์ฐ๋ฆฌ๊ฐ ์ด์ ํ ์ ์๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
- disable rules (๊ท์น ๋ฌดํจํ)
- opt-in on non-default rules (๊ธฐ๋ณธ ์๋ ๊ท์น์ ๋ํ ์ ํ)
- specify only the rules you want to enable (ignoring all default rules) (๋ชจ๋ ๊ท์น ๋ฌด์ํ๊ณ , ์ฌ์ฉํ๋ ค๋ ๊ท์น๋ง ์ง์ )
๋จผ์ .swiftlint.yml ํ์ผ์ ์์ฑํด์ผํ๋ค.
ํ๋ก์ ํธ์ ๊ฐ์ฅ ์์ ํด๋์์ Empty ํ์ผ์ ์์ฑํ๋ค. ํ์ผ ์ด๋ฆ์ .swiftlint.yml์ผ๋ก ์ ์ฅํ๋ค.

๊ทธ๋ฌ๋ฉด ์ด๋ ๊ฒ ํ์ผ์ด ์์ฑ๋๋ค!

์ฌ๊ธฐ์ ์ํ๋ ๋๋ก ์์ฑํ๊ณ ์ฌ์ฉํ๋ฉด ๋๋ค.

disabled_rules: # Default Rules์์ ๋นํ์ฑํ ๊ท์น - trailing_whitespace # Lines should not have trailing whitespace. opt_in_rules: # ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํ๋์ด์์ผ๋ ํ์ฑํํ ๊ท์น - yoda_condition excluded: # File or Directory Lint should exclude. - PodsOpt-In Rules
๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํ๋์ด์์ผ๋, ํ์ฑํํ๊ณ ์ถ์ ๊ท์น์ ์ถ๊ฐํ๋ค.
Guidelines on when to mark a rule as opt-in:
- A rule that can have many false positives (e.g. [empty_count](<https://realm.github.io/SwiftLint/empty_count.html>))
- A rule that is too slow
- A rule that is not general consensus or is only useful in some cases (e.g. [force_unwrapping](<https://realm.github.io/SwiftLint/force_unwrapping.html>))
Disable Rules in code
์๋์ ๊ฐ์ ํฌ๋งท์ ์ฌ์ฉํ์ฌ ๋นํ์ฑํํ ์ ์๋ค.
// swiftlint:disable <rule1> [<rule2> <rule3>...]์ด ๊ท์น์ ํ์ผ์ ๋์ด๋ ํ์ฑํ ์ปค๋ฉํธ๊ฐ ๋์ฌ ๋๊น์ง ๋นํ์ฑํ๋๋ค.
// swiftlint:enable <rule1> [<rule2> <rule3>...]์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
// swiftlint:disable colon let noWarning :String = "" // ๋ณ์ ์ด๋ฆ ์งํ์ ์ฝ๋ก ์ ๋ํ ๊ฒฝ๊ณ X // swiftlint:enable colon let hasWarning :String = "" // ๋ณ์ ์ด๋ฆ ์งํ์ ์ฝ๋ก ์ ๋ํ ๊ฒฝ๊ณ Oall ํค์๋๋ฅผ ํฌํจํ๋ฉด, ํ์ฑํ ์ปค๋ฉํธ๊ฐ ๋์ฌ ๋๊น์ง ๋ชจ๋ ๊ท์น์ด ๋นํ์ฑํ๋๋ค.
// swiftlint:disable all // swiftlint:enable allConfiguration
SwiftLint๋ฅผ ์คํํ ๋๋ ํ ๋ฆฌ์์ .swiftlint.yml ํ์ผ์ ์ถ๊ฐํด์ SwiftLint๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค.
- disabled_rules
- Default Rules ์ค์ ๋นํ์ฑํํ๊ณ ์ถ์ ๊ท์น ์ถ๊ฐ
disabled_rules: # Default Rules์์ ๋นํ์ฑํ ๊ท์น - trailing_whitespace # Lines should not have trailing whitespace. - opt_in_rules
- ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํ๋์ด์์ง๋ง ํ์ฑํํ๊ณ ์ถ์ ๊ท์น ์ถ๊ฐ
opt_in_rules: # ๊ธฐ๋ณธ์ ์ผ๋ก ๋นํ์ฑํ๋์ด์์ผ๋ ํ์ฑํํ ๊ท์น - yoda_condition - only_rules
- ์ด ๋ชฉ๋ก์ ์ง์ ๋ ๊ท์น๋ง ํ์ฑํ. disabled_rules ๋๋ opt_in_rules์ ํจ๊ป ์ง์ ํ ์ ์๋ค.
- analyzer_rules
- ์ค์ง analyze ๋ช ๋ น์ ์ํด์๋ง ์คํ๋๋ ์์ ํ ๋ณ๋์ ๊ท์น ๋ชฉ๋ก์ด๋ค. ๋ชจ๋ analyzer ๊ท์น์ opt-in์ด๋ฏ๋ก ์ด ๊ท์น ๋ชฉ๋ก๋ง ๊ตฌ์ฑํ ์ ์์ผ๋ฉฐ, disabled_rules, only_rules์ ๋์ผํ ๊ท์น์ด ์๋ค.
- included
- SwiftLint ๊ฒ์ฌ์์ ํฌํจํ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํ๋ค.
- excluded
- SwiftLint ๊ฒ์ฌ์์ ์ ์ธํ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ถ๊ฐํ๋ค. included์ ํฌํจ๋ ๊ฒ๋ณด๋ค ์ฐ์ ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ค.
excluded: # SwiftLint ๊ฒ์ฌ์์ ์ ์ธํ ํ์ผ ๊ฒฝ๋ก - Pods - ProjectName/AppDelegate.swift - ProjectName/SceneDelegate.swift
์ฐธ๊ณ ์๋ฃ
SwiftLintFramework Reference
SwiftLint A tool to enforce Swift style and conventions, loosely based on the now archived GitHub Swift Style Guide. SwiftLint enforces the style guide rules that are generally accepted by the Swift community. These rules are well described in popular styl
realm.github.io
Improving Swift Code Readability With SwiftLint
Easily enforce Swift code styling rules with SwiftLint
betterprogramming.pub
'iOS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[iOS] Coordinator Design Pattern ๋ฒ์ญ (1) 2022.05.26 [iOS] safeAreaLayoutGuide (0) 2022.05.26 [iOS] SnapKit ์ฌ์ฉํ๊ธฐ (0) 2022.05.10 [iOS] Xib ์ฌ์ด์ฆ ๋ณ๊ฒฝํ๊ธฐ (0) 2022.04.09 [iOS] Xcode 13.3, Swift 5.6 warning on self (์๋ฌธ ํด๊ฒฐ ๋ชปํจ) (0) 2022.04.06