Swift Lint 써보기

2 답변 글타래를 보이고 있습니다
  • 글쓴이
    • 쥬트
      참가자
      • 글작성 : 9
      • 답글작성 : 8

      Swift Lint란 ‘Linter’ 입니다.

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

      왜 SwiftLint를 사용하나요?


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

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

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

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

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

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

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

      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/
      https://github.com/realm/SwiftLint/blob/master/README_KR.md
      https://subicura.com/2016/07/11/coding-convention.html
      https://realm.github.io/SwiftLint/rule-directory.html
      https://zeddios.tistory.com/447

    • 야곰
      키 마스터
      • 글작성 : 37
      • 답글작성 : 579

      멋진 튜토리얼입니다!

      잘 쓰면 약, 잘못쓰면 독이죠.
      참고는 하되 집착은 하지 않으면 많은 도움 될겁니다 ㅎㅎ

    • Gray
      참가자
      • 글작성 : 0
      • 답글작성 : 1

      강좌 참고자료인줄 알았는데 TIL이었다니, 엄청 큰 도움이 되었습니다! 감사합니다!

2 답변 글타래를 보이고 있습니다
  • 답변은 로그인 후 가능합니다.

logo landscape small

사업자번호 : 743-81-02195
통신판매업 신고번호 : 제 2022-충북청주-1278 호
고객센터 : 카카오톡채널 @yagom