SwiftLint

2025. 2. 25. 14:36·iOS/Setting
반응형

👋 들어가기 전

길고 길었던 파이썬 자동화 작업이 끝나고

드디어 iOS 개발에 들어갈 수 있다.

 

이번 프로젝트 역시 혼자하는 게 아닌 왁뮤 때부터 합을 맞쳐온

구구님과 함께 진행하게 되었다.

 

많이 바쁘신 관계로 세팅을 할 수 있는 영광이 나에게 주워졌다.

 

프로젝트 목표는 처음부터 끝까지 최대한 내가 세팅하고 마무리를 짓고 싶다.

 

그래서 첫번 째 단계는 swiftLint다.

다양한 프로젝트에서 써봤지만 대부분 다른 분이 미리 세팅을 해주셨다.

이번에는 내가 직접 세팅해보자.


✊목적

큰 프로젝트는 아니지만 같이하는 팀원이 있기때문에

코딩 컨벤션을 맞풀 필요가 있다.

 

나는 강제하는게 좋다. 

그렇다면 린트는 좋은 선택이 될 것 같다.


☝️설치

공식 깃헙을 가보면 설치하는 방법이 굉장히 많지만

나는 Homebrew를 좋아하기때문에 Homebrew로 설치한다.

brew install swiftlint

✌️ 제약 조건 만들기

우리가 사용할 제약조건을 명시해야한다.

프로젝트 바로 아래에 .swiftlint.yml 파일을 만들어 제약조건을 명시하자.

공식 문서는 https://realm.github.io/SwiftLint/rule-directory.html 링크를 살펴보고

간단하게 예제 코드를 주석으로 정리해봤다.

disabled_rules: # 기본적으로 활성화된 규칙 중에서 제외할 항목을 지정


opt_in_rules: #기본적으로 꺼져 있는 규칙 중에서 활성화할 항목을 지정
  - empty_count # → isEmpty 대신 .count == 0을 사용하는 코드 검사


# only_rules: # 모든 규칙을 명시적으로 지정하려면 disabled_rules 및 opt_in_rules를 삭제하고 사용
  # - empty_parameters # 빈 매개변수 목록을 허용하지 않음 ,func someFunction { }  // () 없이 함수 선언
  # - vertical_whitespace # 불필요한 공백(빈 줄) 사용을 제한

# analyzer_rules: # swiftlint analyze 명령어 실행 시 적용할 규칙을 설정
#  - explicit_self # → self를 명시적으로 사용할지 여부 검사

# 포함 / 미포함 여부

# included: 검사할 파일/폴더 경로를 지정 (커맨드라인에서 제공하는 경로보다 우선)
  # - Sources → Sources 디렉터리 내의 파일을 검사
# excluded: 검사에서 제외할 파일/폴더 지정
# - Carthage, Pods → 패키지 매니저 관련 폴더 제외
# - Sources/ExcludedFolder, Sources/ExcludedFile.swift → 특정 폴더 및 파일 제외
# - Sources/*/ExcludedFile.swift → 와일드카드(*)를 사용해 특정 패턴의 파일 제외

# allow_zero_lintable_files: false # true로 설정하면 검사할 파일이 없어도 오류 발생 안 함 (false면 오류 발생)
# strict: false # true로 설정하면 모든 경고를 오류로 간주
# baseline:  Baseline.json 기존의 린트 위반 사항을 저장하여 무시할 수 있는 기준 파일 설정
# write_baseline: Baseline.json 새로운 린트 위반 사항을 Baseline.json에 저장
# check_for_updates: true로 설정하면 SwiftLint가 실행될 때마다 업데이트 확인

# 규칙별 세부 사항

# 타입 캐스팅
force_cast: warning  # 강제 형변환 (`as!`) 사용 시 경고
force_try:
  severity: warning  # 강제 `try!` 사용 시 경고

# 코드 길이 제한
line_length: 110  # 한 줄 최대 길이 110자로 제한
type_body_length:
  - 300  # 경고 (타입 본문이 300줄 초과 시)
  - 400  # 오류 (타입 본문이 400줄 초과 시)
file_length:
  warning: 500  # 파일이 500줄 초과 시 경고
  error: 1200  # 파일이 1200줄 초과 시 오류

# 이름 규칙
type_name:
  min_length: 4  # 타입명 최소 4자 (경고)
  max_length:
    warning: 40  # 타입명 40자 초과 시 경고
    error: 50  # 타입명 50자 초과 시 오류
  excluded: iPhone  # "iPhone"은 예외 처리하여 검사하지 않음
  allowed_symbols: ["_"]  # `_` 사용 가능

identifier_name:
  min_length:
    error: 4  # 변수/상수명 최소 4자 (오류)
  excluded:
    - id  # "id" 예외 처리
    - URL  # "URL" 예외 처리

# 출력 형식 설정
reporter: "xcode" # json, csv, html, emoji, github-actions-logging 등 다양한 포맷 가능

👍 Build Phase

⌨️ 스크립트 생성

Build Phase에서 생성 후 Compile Sources 다음으로 옮겨준다.

 

스크립트를 다음과 같이 써준다.

if [ -x /opt/homebrew/bin/swiftlint ]; then # Apple Silicon 실행 가능하다면 true
    /opt/homebrew/bin/swiftlint
elif [ -x /usr/local/bin/swiftlint ]; then # Intel Mac 실행 가능하다면 true
    /usr/local/bin/swiftlint
else
    echo "warning: SwiftLint not installed. Please install it via Homebrew (brew install swiftlint)."
fi

 

먼저 Homebrew로 설치한 swiftlint가 존재하는 지 확인후 존재한다면 실행한다.

 

❌ 오류잡기

일단 위 과정 끝낸 후 빌들하게 되면 다음과 같은 오류가 나온다.

이 오류는 Xcode 15부터 ENABLE_USER_SCRIPT_SANDBOXING

의 기본값이 YES로 변경되어 생긴 문제이다.

 

이 때 파일 실행 권한이 부족해서 발생하는 오류이기 때문에

error: Sandbox: swiftlint(19427) deny(1) file-read-data라는 형태로 나타난다.

💡 ENABLE_USER_SCRIPT_SANDBOXING
Xcode의 빌드 설정(Build Settings)에서 사용되는 설정 값으로, 빌드 과정에서 실행되는
사용자 스크립트(User Script)가 샌드박스 환경에서 실행될지를 결정한다.

 

사진과 같이 Target의 Build Settings에 sandbox를 검색 후 해당 옵션을 꺼준다.


😀 소감 및 마무리

 

설정했단 empty_count가 잘 오류로 검출된다.

 

앞으로 자주 사용될 옵션은 이 포스팅에 업데이트 하도록 하자.


출처

 

GitHub - realm/SwiftLint: A tool to enforce Swift style and conventions.

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

github.com

 

반응형

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

Kakao Login  (1) 2025.07.01
Naver Login  (0) 2025.06.30
Xcode 유용한 단축키 모음  (2) 2025.06.12
SwiftFormat  (0) 2025.06.10
.plist 등록 없이 Custom Font 추가  (0) 2025.03.06
'iOS/Setting' 카테고리의 다른 글
  • Naver Login
  • Xcode 유용한 단축키 모음
  • SwiftFormat
  • .plist 등록 없이 Custom Font 추가
Hamp
Hamp
남들에게 보여주기 부끄러운 잡다한 글을 적어 나가는 자칭 기술 블로그입니다.
  • Hamp
    Hamp의 분리수거함
    Hamp
  • 전체
    오늘
    어제
    • 분류 전체보기 (325)
      • CS (30)
        • 객체지향 (2)
        • Network (7)
        • OS (6)
        • 자료구조 (1)
        • LiveStreaming (3)
        • 이미지 (1)
        • 잡다한 질문 정리 (0)
        • Hardware (2)
        • 이론 (6)
        • 컴퓨터 그래픽스 (0)
      • Firebase (3)
      • Programing Langauge (41)
        • swift (34)
        • python (6)
        • Kotlin (1)
      • iOS (133)
        • UIKit (37)
        • Combine (1)
        • SwiftUI (33)
        • Framework (7)
        • Swift Concurrency (22)
        • Tuist (6)
        • Setting (11)
        • Modularization (1)
        • Instruments (6)
      • PS (59)
        • 프로그래머스 (24)
        • 백준 (13)
        • LeetCode (19)
        • 알고리즘 (3)
      • Git (18)
        • 명령어 (4)
        • 이론 (2)
        • hooks (1)
        • config (2)
        • action (7)
      • Shell Script (2)
      • Linux (6)
        • 명령어 (5)
      • Spring (20)
        • 어노테이션 (6)
        • 튜토리얼 (13)
      • CI-CD (4)
      • Android (0)
        • Jetpack Compose (0)
      • AI (9)
        • 이론 (9)
        • MCP (0)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    dispatch
    UIKit
    protocol
    CS
    Tuist
    concurrency
    dp
    SwiftUI
    AVFoundation
    boostcamp
    property
    프로그래머스
    lifecycle
    Swift
    IOS
    GIT
    백준
    dfs
    Spring
    투포인터
  • 최근 댓글

  • 최근 글

  • 반응형
  • hELLO· Designed By정상우.v4.10.0
Hamp
SwiftLint
상단으로

티스토리툴바