# SwiftLint SwiftLintë ì¤ìíí¸ ì¤íì¼ ë° ì»¨ë²¤ì ì ê°ì í기 ìí ë구ë¡, [Kodeco ì¤ìíí¸ ì¤íì¼ ê°ì´ë](https://github.com/kodecocodes/swift-style-guide)ì ëëµì ì¸ ê¸°ë°ì ëê³ ììµëë¤. SwiftLintë ì¢ ë ì íí 결과를 ìí´ [Clang](http://clang.llvm.org)ê³¼ [SourceKit](http://www.jpsim.com/uncovering-sourcekit)ì ì°ê²°íì¬ ìì¤ íì¼ì [AST](http://clang.llvm.org/docs/IntroductionToTheClangAST.html) ííì ì¬ì©í©ëë¤. [![Build Status](https://dev.azure.com/jpsim/SwiftLint/_apis/build/status/realm.SwiftLint?branchName=main)](https://dev.azure.com/jpsim/SwiftLint/_build/latest?definitionId=4?branchName=main) [![codecov.io](https://codecov.io/github/realm/SwiftLint/coverage.svg?branch=main)](https://codecov.io/github/realm/SwiftLint?branch=main) ![](assets/screenshot.png) 본 íë¡ì í¸ë [Contributor Covenant Code of Conduct](https://realm.io/conduct)를 충ì¤í ë°ë¦ ëë¤. 본 íë¡ì í¸ì ì°¸ì¬í¨ì¼ë¡ì¨ ì´ë¬í ìì¹ì ì¤ìí´ì¼ í©ëë¤. ë°ìë¤ì¼ ì ìë íëª©ì´ ìë¤ë©´ [[email protected]](mailto:[email protected])ë¡ ìë ¤ì£¼ì¸ì. ## ì¤ì¹ ë°©ë² ### [Homebrew](http://brew.sh/)를 ì¬ì©íë ê²½ì°: ``` brew install swiftlint ``` ### [CocoaPods](https://cocoapods.org)를 ì¬ì©íë ê²½ì°: Podfileì ìë ë¼ì¸ì ì¶ê°íê¸°ë§ íë©´ ë©ëë¤. ```ruby pod 'SwiftLint' ``` ì´ë¥¼ ì¤ííë©´ ë¤ìë² `pod install` ì¤í ì SwiftLint ë°ì´ë리 ë° `Pods/`ì ìë ëíëìë¤ì ë¤ì´ë¡ëíê³ , Script Build Phasesìì `${PODS_ROOT}/SwiftLint/swiftlint` ëª ë ¹ì ì¬ì©í ì ìê² ë©ëë¤. CocoaPods를 ì¬ì©íë©´ ìµì ë²ì ì¸ìë SwiftLintì í¹ì ë²ì ì ì¤ì¹í ì ì기 ë문ì ì´ ë°©ë²ì ê¶ì¥í©ëë¤. (Homebrewë ìµì ë²ì ë§ ì¤ì¹ ê°ë¥) ì´ë ê² íì ë SwiftLint ë°ì´ë리 ë° ê·¸ì ì¢ ìë ë°ì´ë리ë¤ê³¼ ì¤ìíí¸ ë°ì´ë리ê¹ì§ `Pods/` ëë í°ë¦¬ì ì¶ê°ë기 ë문ì, git ë±ì SCMì ì´ë° ëë í°ë¦¬ë¤ì ì²´í¬ì¸íë ê²ì ê¶ì¥íì§ ììµëë¤. ### [Mint](https://github.com/yonaskolb/mint)를 ì¬ì©íë ê²½ì°: ``` $ mint install realm/SwiftLint ``` ### ë¹ëë í¨í¤ì§ë¥¼ ì¬ì©íë ê²½ì°: [ìµì ê¹íë¸ ë¦´ë¦¬ì¦](https://github.com/realm/SwiftLint/releases/latest)ìì `SwiftLint.pkg`를 ë¤ì´ë¡ëí´ì ì¤ì¹íê³ ì¤íí ì ììµëë¤. ### ìì¤ë¥¼ ì§ì ì»´íì¼íë ê²½ì°: 본 íë¡ì í¸ë¥¼ í´ë¡ í´ì ë¹ëí ìë ììµëë¤. `make install` ëª ë ¹ì ì¬ì©í©ëë¤. (Xcode 12.5 ì´í ë²ì ) ## ì¬ì© ë°©ë² ### íë ì í ì´ì íë¡ì í¸ì SwiftLint를 íµí©í기 ìí ê¶ì¥ ì¬ì© ë°©ìì ì ë°ì ì¸ ê°ì를 ìê³ ì¶ë¤ë©´, ìë íë ì í ì´ì ììì ë³´ê±°ë ì¤í¬ë¦½í¸ë¥¼ ì½ì´ë³´ë©´ ì¢ìµëë¤. [![Presentation](assets/presentation.svg)](https://youtu.be/9Z1nTMTejqU) ### Xcode SwiftLint를 Xcode íë¡ì í¸ì íµí©íì¬ IDE ìì ê²½ê³ ë ìë¬ë¥¼ íìí ì ììµëë¤. íë¡ì í¸ì íì¼ ë´ë¹ê²ì´í°ìì íê² ì±ì ì í í "Build Phases" íì¼ë¡ ì´ëí©ëë¤. + ë²í¼ì í´ë¦í í "Run Script Phase"를 ì íí©ëë¤. ê·¸ í ìë ì¤í¬ë¦½í¸ë¥¼ ì¶ê°íê¸°ë§ íë©´ ë©ëë¤. ```bash if which swiftlint >/dev/null; then swiftlint else echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint" fi ``` ![](assets/runscript.png) ë§ì½, ì í ì¤ë¦¬ì½ íê²½ìì Homebrew를 íµí´ SwiftLint를 ì¤ì¹íë¤ë©´, ìë§ë ë¤ìê³¼ ê°ì ê²½ê³ ë¥¼ 겪ìì ê²ì ëë¤. > warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint ê·¸ ì´ì ë, ì í ì¤ë¦¬ì½ ê¸°ë° ë§¥ìì Homebrewë 기본ì ì¼ë¡ ë°ì´ë리ë¤ì `/opt/homebrew/bin`ì ì ì¥í기 ë문ì ëë¤. SwiftLintê° ì´ë ìëì§ ì°¾ë ê²ì Xcodeì ìë ¤ì£¼ê¸° ìí´, build phaseìì `/opt/homebrew/bin`를 `PATH` íê²½ ë³ìì ëìì ì¶ê°íì¬ì¼ í©ëë¤. ```bash if [[ "$(uname -m)" == arm64 ]]; then export PATH="/opt/homebrew/bin:$PATH" fi if which swiftlint > /dev/null; then swiftlint else echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint" fi ``` í¹ì ìëì ê°ì´ `/usr/local/bin`ì ì¬ë³¼ë¦ ë§í¬ë¥¼ ìì±íì¬ ì¤ì ë°ì´ëë¦¬ê° ìë ê³³ì¼ë¡ í¬ì¸í í ì ììµëë¤. : ```bash ln -s /opt/homebrew/bin/swiftlint /usr/local/bin/swiftlint ``` ë¹ì ì SwiftLint phase를 'Compile Sources' ë¨ê³ ì§ì ì¼ë¡ ì®ê²¨ ì»´íì¼ ì ì ìë¬ë¥¼ ë¹ ë¥´ê² ì°¾ê³ ì¶ì´ í ê²ì ëë¤. íì§ë§, SwiftLintë ì»´íì¼ë¬ì 구문 ë¶ì ë¨ê³ë¥¼ ìë²½í ìííë ì í¨í Swift ì½ë를 ì¤íí기 ìí´ ì¤ê³ëììµëë¤. ë°ë¼ì, 'Compile Sources' ì ì SwiftLint를 ì¤ííë©´ ì¼ë¶ ë¶ì íí ì¤ë¥ê° ë°ìí ìë ììµëë¤. ë§ì½ ë¹ì ì ìë° ì¬í(violations)ì ëìì ìì íë ê²ì ìíë¤ë©´, ì¤í¬ë¦½í¸ì `swiftlint` ëì `swiftlint --fix && swiftlint`ì ì ì´ì¼ í©ëë¤. ì´ë íë¡ì í¸ì ìì ê°ë¥í 모ë ìë° ì¬íë¤ì´ ìì ëê³ ëë¨¸ì§ ìë° ì¬íì ëí ê²½ê³ ê° íìëë¤ë ê²ì ì미í©ëë¤. CocoaPods를 ì¬ì©í´ì ì¤ì¹í ê²½ì°ë ìë ì¤í¬ë¦½í¸ë¥¼ ëì ì¬ì©í©ëë¤. ```bash "${PODS_ROOT}/SwiftLint/swiftlint" ``` #### Xcode ì ì¥ì ì¤íëë íë¬ê·¸ì¸ Xcodeìì ì ì¥ì `swiftlint autocorrect`를 ì¤ííë ¤ë©´ Alcatrazìì [SwiftLintXcode](https://github.com/ypresto/SwiftLintXcode) íë¬ê·¸ì¸ì ì¤ì¹í©ëë¤. â ï¸ì´ íë¬ê·¸ì¸ì Xcode 8ìì SIP를 ë¹íì±ííì§ ìì¼ë©´ ëìíì§ ìì¼ë©°, ì´ë ê¶ì¥íì§ ììµëë¤. ### AppCode AppCodeìì SwiftLint를 ì¬ì©íë ¤ë©´ [ì´ íë¬ê·¸ì¸](https://plugins.jetbrains.com/plugin/9175)ì ì¤ì¹íê³ íë¬ê·¸ì¸ íê²½ì¤ì ìì SwiftLintê° ì¤ì¹ë ê²½ë¡ë¥¼ ì§ì í´ì¤ëë¤. `autocorrect` ì¡ì ì `â¥â` ë¨ì¶í¤ë¡ ì¬ì©í ì ììµëë¤. ### Atom [Atom](https://atom.io/)ìì SwiftLint를 ì¬ì©íë ¤ë©´ APMìì [`linter-swiftlint`](https://atom.io/packages/linter-swiftlint) í¨í¤ì§ë¥¼ ì¤ì¹í©ëë¤. ### fastlane fastlane ê³¼ì ìì SwiftLint를 ì¬ì©íë ¤ë©´ [ê³µìì ì¸ fastlane ì¡ì ](https://docs.fastlane.tools/actions/swiftlint)를 ì¬ì©í ì ììµëë¤. ```ruby swiftlint( mode: :lint, # SwiftLint 모ë: :lint (ëí´í¸) ìëë©´ :autocorrect  executable: "Pods/SwiftLint/swiftlint", # SwiftLint ë°ì´ë리 ê²½ë¡ (ì í ê°ë¥). CocoaPods를 ì¬ì©í´ì ì¤ì¹í ê²½ì°ë ì´ ìµì ì´ ì¤ìí©ëë¤ Â output_file: "swiftlint.result.json", # ê²°ê³¼ íì¼ì ê²½ë¡ (ì í ê°ë¥)  reporter: "json", # ë³´ê³ ì í (ì í ê°ë¥)  config_file: ".swiftlint-ci.yml",   # ì¤ì íì¼ì ê²½ë¡ (ì í ê°ë¥) ignore_exit_status: true # SwiftLint ì¢ ë£í ë 0ì´ ìë ë°íí ì¢ ë£ ì½ë를 무ìí´ì fastlane ê³ì ì¤íí©ëë¤ ) ``` ### 커맨ë ë¼ì¸ ``` $ swiftlint help Available commands: autocorrect Automatically correct warnings and errors help Display general or command-specific help lint Print lint warnings and errors for the Swift files in the current directory (default command) rules Display the list of rules and their identifiers version Display the current version of SwiftLint ``` ì¤ìíí¸ íì¼ì´ ìë ëë í°ë¦¬ìì `swiftlint`를 ì¤íí©ëë¤. ëë í°ë¦¬ë ì¬ê·ì ì¼ë¡ íìë©ëë¤. `lint`ë `autocorrect`를 ì¬ì©í ë ì¬ë¬ íì¼(ì를 ë¤ë©´, [`ExtraBuildPhase`](https://github.com/norio-nomura/ExtraBuildPhase) íë¬ê·¸ì¸ì ìí´ Xcodeê° ë³ê²½í íì¼ë¤ í¹ì `git ls-files -m` ëª ë ¹ì¼ë¡ ì¸í´ ìì í¸ë¦¬ìì ë³ê²½ë íì¼ë¤)ì ì§ì íë ¤ë©´ `--use-script-input-files` ìµì ì ëê¸°ê³ ë¤ì ì¸ì¤í´ì¤ ë³ìë¤ì ì¤ì íë©´ ë©ëë¤. `SCRIPT_INPUT_FILE_COUNT` and `SCRIPT_INPUT_FILE_0`, `SCRIPT_INPUT_FILE_1`...`SCRIPT_INPUT_FILE_{SCRIPT_INPUT_FILE_COUNT - 1}` ì´ë [Xcodeì 커ì¤í ì¤í¬ë¦½í¸ ë¨ê³](http://indiestack.com/2014/12/speeding-up-custom-script-phases/)ì ì ë ¥ íì¼ë¡ íê²½ ë³ì를 ì§ì íë ê²ê³¼ ëì¼í©ëë¤. ### ì¤ìíí¸ ì¬ë¬ ë²ì ì ëí ëì SwiftLintë SourceKitì ì°ê²°ëì´ ìì¼ë¯ë¡ ì¤ìíí¸ ì¸ì´ê° ë³ííëë¼ë ì´ì ìì´ ëìí ì ììµëë¤. ì´ë ì ì²´ ì¤ìíí¸ ì»´íì¼ë¬ê° í¬í¨ëì§ ììë ëë¯ë¡ SwiftLintê° ê°ê²°íê² ì ì§ë ì ììµëë¤. SwiftLintë ë°ì¤í¬íì ì´ë¯¸ ì¤ì¹ëì´ ìë ê³µì ì¤ìíí¸ ì»´íì¼ë¬ì íµì íê¸°ë§ íë©´ ë©ëë¤. SwiftLint를 ì¤íí ëë íì ì¤ìíí¸ íì¼ì ì»´íì¼íë ëì¼í í´ì²´ì¸ì ì¬ì©í´ì¼ í©ëë¤. ì¤ì¹ë í´ì²´ì¸ì´ë Xcodeê° ì¬ë¬ ê°ì¸ ê²½ì° í¹ì ì¤ìíí¸ êµ¬ ë²ì ì ì¬ì©í´ì¼ íë ê²½ì°(Xcode 8ìì ì¤ìíí¸ 2.3 ë²ì ì ì¬ì©íë ê²½ì°)ìë SwiftLintì 기본 ì¤ìíí¸ í´ì²´ì¸ì ë³ê²½í´ì¼ í ìë ììµëë¤. SwiftLintê° ì´ë ì¤ìíí¸ í´ì²´ì¸ì ì¬ì©í ì§ ê²°ì íë ììë ë¤ìê³¼ ê°ìµëë¤. * `$XCODE_DEFAULT_TOOLCHAIN_OVERRIDE` * `$TOOLCHAIN_DIR` or `$TOOLCHAINS` * `xcrun -find swift` * `/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain` * `/Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain` * `~/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain` * `~/Applications/Xcode-beta.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain` `sourcekitd.framework`ì ììì ì íë ê²½ë¡ì `usr/lib/` íì ëë í°ë¦¬ì ì¡´ì¬í´ì¼ í©ëë¤. `TOOLCHAINS` íê²½ ë³ìì ì¤ìíí¸ í´ì²´ì¸ ë²ì ì ìë³í ì ìë ê°ì 리ë²ì¤ DNS íìì¼ë¡ ì§ì í ìë ììµëë¤. ```shell $ TOOLCHAINS=com.apple.dt.toolchain.Swift_2_3 swiftlint autocorrect ``` 리ë ì¤ììë SourceKitì´ `/usr/lib/libsourcekitdInProc.so` í¹ì `LINUX_SOURCEKIT_LIB_PATH` íê²½ë³ìë¡ ì§ì ë ê²½ë¡ì ì¡´ì¬í´ì¼ í©ëë¤. ## 룰 SwiftLintìë 200ê°ê° ëë 룰ë¤ì´ ìê³ , ì¤ìíí¸ ì»¤ë®¤ëí°(ë°ë¡ ì¬ë¬ë¶ë¤!)ë ì´ë¥¼ ì§ìì ì¼ë¡ ë°ì ìì¼ ê°ê³ ììµëë¤. [í 리íì¤í¸](CONTRIBUTING.md)ë ì¸ì ë íìì ëë¤. íì¬ êµ¬íë 룰 ì 체를 íì¸íë ¤ë©´ [Source/SwiftLintBuiltInRules/Rules](Source/SwiftLintBuiltInRules/Rules)를 ì´í´ë³´ì¸ì. `opt_in_rules`ë 기본ì ì¼ë¡ ë¹íì±íëì´ ììµëë¤. (ì¦, ì¤ì íì¼ìì ëª ìì ì¼ë¡ í´ë¹ 룰ì íì±íí´ì¼ í©ëë¤.) ë¤ìì 룰ì ìµí¸ ì¸ì¼ë¡ 구ííë ê²½ì°ì ëí 기ì¤ì ëë¤. * ì못 íë¨ë ê°ë¥ì±ì´ ë§ì 룰 (ì: `empty_count`) * ìëê° ë§¤ì° ë린 룰 * ì¼ë°ì ì¼ë¡ 모ë ì¬ëì´ í©ìíì§ ìê±°ë í¹ì í ìí©ìë§ ì ì©í 룰 (ì: `force_unwrapping`, `missing_docs`) ### ì½ëìì 룰 ë¹íì±íí기 ìì¤ íì¼ìì ìë íìì 주ìì ì¬ì©íë©´ 룰ì ë¹íì±íí ì ììµëë¤. `// swiftlint:disable <룰1> [<룰2> <룰3>...]` ë¹íì±íë 룰ì í´ë¹ íì¼ì ë§ì§ë§ê¹ì§ ì ì©ëê±°ë, íì±í 주ìì´ ëíë ëê¹ì§ ì ì©ë©ëë¤. `// swiftlint:enable <룰1> [<룰2> <룰3>...]` ì를 ë¤ë©´ ë¤ìê³¼ ê°ìµëë¤. ```swift // swiftlint:disable colon let noWarning :String = "" // ë³ìëª ë°ë¡ ë¤ì ì½ë¡ ì´ ìì¹íì§ ìëë¤ê³ ê²½ê³ ê° ë¨ì§ ììµëë¤! // swiftlint:enable colon let hasWarning :String = "" // ë³ìëª ë°ë¡ ë¤ì ì½ë¡ ì´ ìì¹í´ì¼ íë¤ë ê²½ê³ ê° íìë©ëë¤. ``` `disable`ê³¼ `enable` ëª ë ¹ ë¤ì `:previous`, `:this`, `:next`를 ë¶ì´ë©´ ê°ê° ëª ë ¹ì´ ìì¹í ì´ì ë¼ì¸, íì¬ ë¼ì¸, ë¤ì ë¼ì¸ë§ ë£°ì´ ì ì©ëê² í ì ììµëë¤. ì를 ë¤ë©´ ë¤ìê³¼ ê°ìµëë¤. ```swift // swiftlint:disable:next force_cast let noWarning = NSNumber() as! Int let hasWarning = NSNumber() as! Int let noWarning2 = NSNumber() as! Int // swiftlint:disable:this force_cast let noWarning3 = NSNumber() as! Int // swiftlint:disable:previous force_cast ``` `swiftlint rules`를 ì¤ííë©´ 모ë 룰 목ë¡ê³¼ ë£°ë³ ìë³ìê° íìë©ëë¤. ### ì¤ì SwiftLintê° ì¤íë ëë í°ë¦¬ì `.swiftlint.yml` íì¼ì ì¶ê°í´ì SwiftLint를 ì¤ì í ì ììµëë¤. ìë íë¼ë¯¸í°ë¤ì ì¤ì ê°ë¥í©ëë¤. 룰 ì ì©ì¬ë¶ ì¤ì : * `disabled_rules`: 기본 íì±íë 룰 ì¤ì ë¹íì±íí 룰ë¤ì ì§ì í©ëë¤. * `opt_in_rules`: 기본 ë£°ì´ ìë 룰ë¤ì íì±íí©ëë¤. * `only_rules`: ì§ì í 룰ë¤ë§ íì±íëëë¡ íì´í¸ë¦¬ì¤í¸ë¡ ì§ì í©ëë¤. `disabled_rules` ë° `opt_in_rules`ê³¼ë ê°ì´ ì¬ì©í ì ììµëë¤. ```yaml disabled_rules: # ì¤íìì ì ì¸í 룰 ìë³ìë¤ - colon - comma - control_statement opt_in_rules: # ì¼ë¶ 룰ì ìµí¸ ì¸ ííë¡ ì ê³µ - empty_count - missing_docs # ì¬ì© ê°ë¥í 모ë 룰ì swiftlint rules ëª ë ¹ì¼ë¡ íì¸ ê°ë¥ included: # ë¦°í¸ ê³¼ì ì í¬í¨í íì¼ ê²½ë¡. ì´ íëª©ì´ ì¡´ì¬íë©´ `--path`ë 무ìë¨ - Sources excluded: # ë¦°í¸ ê³¼ì ìì 무ìí íì¼ ê²½ë¡. `included`ë³´ë¤ ì°ì ìì ëì - Carthage - Pods - Sources/ExcludedFolder - Sources/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, codeclimate, checkstyle, junit, html, emoji, sonarqube, markdown, github-actions-logging) ``` #### 커ì¤í 룰 ì ì ìë 문ë²ì ì¬ì©íì¬ ì¤ì íì¼ì ìë¡ì´ ì ê· ííì 기ë°ì 룰ì ì ìí ì ììµëë¤. ```yaml custom_rules: pirates_beat_ninjas: # 룰 ìë³ì included: ".*.swift" # ë¦°í¸ ì¤í ì í¬í¨í ê²½ë¡ë¥¼ ì ìíë ì ê·ííì. ì í ê°ë¥. name: "Pirates Beat Ninjas" # 룰 ì´ë¦. ì í ê°ë¥. regex: "([nN]inja)" # í¨í´ ë§¤ì¹ match_kinds: # 매ì¹í SyntaxKinds. ì í ê°ë¥. - comment - identifier message: "Pirates are better than ninjas." # ìë° ë©ìì§. ì í ê°ë¥. severity: error # ìë° ìì¤. ì í ê°ë¥. no_hiding_in_strings: regex: "([nN]inja)" match_kinds: string ``` ê²°ê³¼ë ë¤ìê³¼ ê°ìµëë¤. ![](assets/custom-rule.png) íë ì´ìì `match_kinds`를 ì¬ì©í´ì 매ì¹ë 결과를 íí°ë§í ì ììµëë¤. ì´ ëª©ë¡ì ë¤ì´ìì§ ìì 구문 ì íì´ í¬í¨ë ê²°ê³¼ë 매ì¹ìì ì ì¸ë©ëë¤. ì¬ì© ê°ë¥í 모ë 구문 ì íì ë¤ìê³¼ ê°ìµëë¤. * argument * attribute.builtin * attribute.id * buildconfig.id * buildconfig.keyword * comment * comment.mark * comment.url * doccomment * doccomment.field * identifier * keyword * number * objectliteral * parameter * placeholder * string * string_interpolation_anchor * typeidentifier #### ì¤ì²© êµ¬ì± SwiftLintë ì¤ì íì¼ì ì¤ì²©ëê² êµ¬ì±í´ì ë¦°í¸ ê³¼ì ì ëì± ì¸ë°íê² ì ì´í ì ììµëë¤. * ëë í°ë¦¬ 구조ìì íìí ê³³ì´ë©´ ì´ëë ì§ `.swiftlint.yml` íì¼ì ì¶ê°í ì ììµëë¤. * ê° íì¼ì ìì ì ëë í°ë¦¬ ë´ì ìë ì¤ì íì¼ì ì¬ì©íê±°ë, ê³ì¸µêµ¬ì¡° ì ê°ì¥ ê°ê¹ì´ ë¶ëª¨ ëë í°ë¦¬ì ìë ì¤ì íì¼ì ì¬ì©í´ì 린í¸ë©ëë¤. ë³ëë¡ ì¤ì íì¼ì´ ì¡´ì¬íì§ ìì¼ë©´ 루í¸ì ìë ì¤ì íì¼ì´ ì¬ì©ë©ëë¤. * ì¤ì²© 구ì±ìì `excluded` ë° `included`ë 무ìë©ëë¤. ### ìë ìì SwiftLintë ì¼ë¶ ìë° ì¬íë¤ì ìëì¼ë¡ ìì í ì ììµëë¤. ëì¤í¬ ìì íì¼ë¤ì ìì ë ë²ì ì¼ë¡ ë®ì´ ì°ì¬ì§ê² ë©ëë¤. `swiftlint autocorrect`를 ì¤íí기 ì ì íì¼ë¤ì ë°±ì í´ì£¼ì¸ì. ê·¸ë ì§ ìì¼ë©´ ì¤ìí ë°ì´í°ê° ì ì¤ë ìë ììµëë¤. íì¤ ë¦°í¸ ê²ì¬ë ìë ìì ì¤ìë ë¹íì±íë©ëë¤. ìë° ì¬íë¤ì íì¼ì´ ìë ìì ë íì ëì´ì ì í¨íì§ ìì ê°ë¥ì±ì´ í¬ê¸° ë문ì ëë¤. ## ë¼ì´ì ì¤ [MIT ë¼ì´ì ì¤.](LICENSE) ## About SwiftLintë Realm Inc.ì ìí´ ë§ë¤ì´ì ¸ì ê´ë¦¬ëê³ ììµëë¤. Realmì ì´ë¦ê³¼ ë¡ê³ ë Realm Inc.ì í¸ë ì´ë ë§í¬ì ëë¤. ì°ë¦¬ë ì¤í ìì¤ ìíí¸ì¨ì´ë¥¼ ì¬ëí©ëë¤:heart:! Realmì [ë¤ë¥¸ ì¤íìì¤ íë¡ì í¸](https://github.com/realm)ì [ë¸ë¡ê·¸](https://realm.io/news)ë¤ë ë¤ë¬ì£¼ìê³ , í¸ìí°([@realm](https://twitter.com/realm))ë¡ë ë°ê°ê² ì¸ì¬ 주ì¸ì.