Swift Lint 사용해보기 !!

2020. 4. 10. 00:45iOS/Swift

Swift Linter란 'Linter' 입니다.

'Linter란' 커뮤니티나 팀에서 정한 스타일 규칙을 따르지 않는 코드 부분을 식별하고 표시하는 것을 돕습니다.

왜 SwiftLint를 사용하나요?

개발자마다 코딩스타일은 다르지만, 코딩 표준이라고도 불리는 코딩 컨벤션은 코드를 작성할 때 추천하는 코딩 스타일, 괜찮은 사례등을 모아놓은 가이드라인 입니다.

이러한 코딩 컨벤션들을 Rule로 정함으로써 모든 Swift 코드가 일관성을 유지하도록 해줍니다. 이렇게 하면 새로운 개발자가 합류하거나 예전 코드를 읽을 때 도움이 됩니다.

또한 이러한 프로젝트를 잘 알고있고 유지해 온다면, 다른 프로젝트를 봐도 효과적으로 어떤 것이 무슨 역활을 하는지 이해할 수 있고 이언어에 익숙하다는 좋은 느낌을 가질 수 있습니다.

따라서 이러한 코딩 컨벤션을 도구가 자동으로 해준다면 핵심 기능에 보다 더 집중할 수 있게 될 것 입니다.

현재 SwiftLint에는 75개가 넘는 룰들이 있습니다. 이는 지속적인 Pull Request를 통해 수정 보안되고 있습니다.

전체 Rule은 다음의 링크에서 확인해 볼 수 있습니다.

https://realm.github.io/SwiftLint/rule-directory.html

 

Rule Directory Reference

 

realm.github.io

Rule 공식문서에는 다양한 규칙들의 식별자(rule 설정에 있어서 필요합니다), default 설정 여부, 자동수정 여부, 최소 Swift Compiler 버전 등등 다양한 사항이 명시가 되어있습니다.

이러한 Rule들은 Default로 적용되는 Rule도 있지만 사용자에 의해 적용되는 Rule들도 또한 존재합니다. (문서에 명시되어 있다)

따라서 이러한 Rule들을 세부적으로 적용시키기 위해서는 .swiftlint.yml파일을 추가해주어야 합니다.

Rule 적용 여부를 설정하는 파라미터에는 크게 세가지가 있습니다.

  • disabled_rules : 기본 활성화된 룰 중에 비활성화할 룰들을 지정합니다.
  • opt_in_rules : 기본 룰이 아닌 룰들을 활성화합니다.
  • whitelist_rules : 지정한 룰들만 활성화되도록 화이트리스트로 지정합니다. disabled_rules 및 opt_in_rules 와는 같이 사용할 수 없습니다.

아래는 SwiftLint 공식문서에서 예시로 제공한 룰 설정 파일입니다.

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

이러한 Rule들을 자동으로 수정하도록 할 수도 있으나 원본이 사라질 수 있으니 주의해서 사용해야 합니다.

적용

이러한 Swift Lint를 프로젝트에 적용시켜 보겠습니다. !!

1. Pod install

먼저 적용할 프로젝트 Podfile로 SwiftLint를 추가합니다.

pod 'SwiftLint'

2. Script 작성

그 다음 Target -> build phase -> + -> New Run Script Phase를 눌러줍니다.

이제 Run Script에 다음과 같은 코드를 추가해주시면 됩니다.

${PODS_ROOT}/SwiftLint/swiftlint

그 다음 빌드(Cmd + b)를 하시면 보이시겠지만 엄청난 양의 Warning이 눈에 들어올 것입니다....

오마이 갓뜨

자세한 설명이 (영어로..) 되어 있으니 수정하면서 없애는 재미가 쏠쏠합니다 ^^

그래도 이런 수정이 귀찮으시면 아까 위에 스크립트에서 autocorrect만 뭍혀주시면 빌드시 자동으로 정리가 됩니다. (적용해 보니 147개 정도의 Warning이 모두 사라져 있었습니다!)

하지만 이러한 Warning은 직접 작성한 코드가 아닌 기본적인 파일이나 다른 Podfile에도 적용이 됩니다. 

따라서 이러한 원하지 않는 Warning을 막기 위해서는 .swiftlint.yml 파일을 작성하셔야 합니다.

빈 파일로 최상위 경로에 다음과 같이 만들어 줍니다.

.swiftlint.yml을 작성하시는 방법은 사용자의 자유입니다. 저는 앞서 공식문서에 제공된 것을 사용해보려 합니다. 그 중애서 저는 AppDelegate와 SceneDelegate에서 뜨는 Warning이 상당히 거슬렸기 때문에 이 파일들을 제외시켜보겠습니다.

excluded: # 린트 과정에서 무시할 파일 경로. `included`보다 우선순위 높음
  - Pods
  - SignUp/AppDelegate.swift
  - SignUp/SceneDelegate.swift

다음과 같이 excluded를 통해 경로를 설정하여 Lint를 제외할 파일을 넣고 그 외 Default 설정이 아닌 여러가지 rule들을 적용시켜 볼 수 있습니다.

[참고자료]

https://academy.realm.io/kr/posts/slug-jp-simard-swiftlint/

 

SwiftLint로 보다 명확하고 깔끔한 코드를 만들어 보세요!

코드를 간결하고 명료하게 유지하도록 도와주는 SwiftLint의 사용 방법을 알려 드립니다.

academy.realm.io

https://github.com/realm/SwiftLint/blob/master/README_KR.md

 

realm/SwiftLint

A tool to enforce Swift style and conventions. Contribute to realm/SwiftLint development by creating an account on GitHub.

github.com

https://subicura.com/2016/07/11/coding-convention.html

 

linter를 이용한 코딩스타일과 에러 체크하기

홈쇼핑처럼 6번째 상품인 까르보돈까스는 부먹과 찍먹을 선택해야 합니다. 코딩도 둘중에 하나를 선택해야 하는 경우가 많은데 협업을 위해 코딩 스타일을 설정하고 규칙에 어긋난 코드를 한땀한땀 수정했던 순간이 떠올라 linter에 대해 이야기합니다.

subicura.com

https://realm.github.io/SwiftLint/rule-directory.html

 

Rule Directory Reference

 

realm.github.io

https://zeddios.tistory.com/447

 

iOS ) 내 프로젝트에 SwiftLint를 적용해보자

안녕하세요 :) Zedd입니다. 오늘은 SwiftLint사용법~.~ 간단해요!!!!! 얼른 해봅시댜 근데 SwiftLint github가면 다 나와있어요 :) 그리고 코코아팟을 사용할 줄 안다는 가정하에 글을 쓰겠습니다. 코코아팟을 사..

zeddios.tistory.com

 

'iOS > Swift' 카테고리의 다른 글

UIBezierPath 사용해보기  (0) 2020.10.16
Swift Combine은 또 뭐야 ..?  (1) 2020.09.04
KVO에 대해 알아보고 적용해 보자 !!  (0) 2020.08.07