SwiftFormat

👋 들어가기 전
SwiftFormat.. 통일된 컨벤션을 위해 많이썼던 tool이다.
생각보다 프로젝트 초기에 이놈 세팅한다고 시간을 많이 버렸던 기억들이 많다..
이번 포스팅에서 SwiftFormat을 세팅하는 과정을 정리해보자.
🏁 학습할 내용
지금까지 써본 방법과 건너 건너 배운 방법은 아래 2가지 정도가 가장 깔끔했던 것 같다.
- brew + .swiftFormat + script
- swiftFormat-for-Xcode
1️⃣ brew + .swiftFormat + script
첫번 째 방법은 가장 익숙하게 써온 방법이다.
🚀 설치
먼저 brew를 통해 swiftFormat을 설치해준다.
brew install swiftformat
📜 룰 작성
.swiftformat 파일로 작성한다.
더 많은 룰은 https://github.com/nicklockwood/SwiftFormat/blob/main/Rules.md 공식 페이지를 참고
// .swiftformat
# format options
--swiftversion 6.0
--indent 4
# file options
--exclude /Tuist
# rules
--disable trailingCommas
--enable blockComments
--enable markTypes
--enable noExplicitOwnership
--enable sortSwitchCases
--enable wrapEnumCases
⚙️ 스크립트
스크립트 실행 트리거가 퍼포먼스에 영향을 많이주는데
컨벤션이 많이 중요하면 Xcode의 Build Script쪽에 넣어 매 build마다 실행시켜도 되긴하는데
나에게 swiftFormat을 알려준 분깨서는 githooks의 pre-push쪽에 넣으셨고
이유를 들어보니 pre-push가 나쁘지 않았던 것 같아다.
swiftFormat은 rule에 맞게 코드를 건드리는데, 매 build마다 하게되면, swiftFormat으로 인한 코드 수정이
너무 많이 일어나는 부작용이 있다.
pre-push 내용은 https://hamp.tistory.com/127 글을 보자.
#!/bin/sh
# 명령어 경로 저장
FORMAT=$(which swiftformat)
# 설치 확인
if [[ -e "${FORMAT}" ]]; then
echo "🚀 SwiftFormat 시작..."
echo "🔍 SwiftFormat 적용 경로: ./Projects"
else
echo "SwiftFormat이 존재하지 않습니다. 설치해주세요 ! 'brew install swiftformat'"
exit 1
fi
# 포맷팅 결과 ,
RESULT=$($FORMAT ./Projects --config .swiftformat)
if [ "$RESULT" == '' ]; then
git add .
git commit -m "style swiftformat 적용"
printf "\n 🎉 SwiftFormat 적용을 완료했습니다 !! \n"
else
echo ""
printf "❌ SwiftFormat Failed 아래 내용을 확인해주세요 \n"
while read -r line; do
FILEPATH=$(echo $line | cut -d : -f 1)
L=$(echo $line | cut -d : -f 2)
C=$(echo $line | cut -d : -f 3)
TYPE=$(echo $line | cut -d : -f 4 | cut -c 2-)
MESSAGE=$(echo $line | cut -d : -f 5 | cut -c 2-)
DESCRIPTION=$(echo $line | cut -d : -f 6 | cut -c 2-)
if [ $TYPE == 'warning' ]; then #
printf "\n 🚧 $TYPE\n"
printf " $FILEPATH:$L:$C\n"
printf " 📌 $MESSAGE: - $DESCRIPTION\n"
exit 0 # 정상 종료
elif [ $TYPE == 'error' ]; then
printf "\n 🚨 $TYPE\n"
fi
printf " ✅ $FILEPATH:$L:$C\n"
printf " 📌 $MESSAGE: - $DESCRIPTION\n"
done <<< "$RESULT" # RESULT를 1줄씩 line 변수에 삽입
printf "\n 🚑 커밋실패!! SwiftFormat 실행이 실패하였습니다 🥺 \n"
exit 1 # 비정상 종료
fi
💡 문자열 cut -d [구분자] -f [필드번호]
- 문자열을 구분자를 기준으로 자른 후, 해당 필드번호에 해당되는 부분을 추출
- 여기서 필드 번호는 1번부터 시작
echo "abc:def:hi" | cut -d : -f 1
// OUTPUT: abc
💡 문자열cut -c [시작 위치]-[끝 위치]
- 문자열을 시작위치부터 끝 위치까지 추출
- 끝 위치를 생략하면 문자열 끝까지 추출
echo "abc:def:hi" | cut -d : -f 1 | cut -c 1-2
// OUTPUT: ab
2️⃣ swiftFormat-for-Xcode
이번에 경험해볼 방법은 바로 Xcode 확장프로그램으로 설치해보는 방법이다.
🚀 설치
brew install --cask swiftformat-for-xcode # 설치
brew upgrade --cask swiftformat-for-xcode # 업데이트
📜 룰 작성
rule 작성은 확장 프로그램 내에 작성하면된다.
- command+space로 검색창을 연다.
- swiftFormat for Xcode를 검색
- rules 탭에 들어가 원하는 룰을 체크해준다.


🔌 Xcode에 연결
이제 확장 프로그램을 Xcode에 연결하면 마무리가 된다.
system setting -> Login Items & Extensions -> Xcode Source Editor -> SwiftFormat 체크


⌨️ 단축키 등록
어느 시점에 format을 진행할지 단축키를 등록해보자.
system setting -> keyboard shortcuts -> app shortcuts -> + 버튼을 눌러 다음과 같이 입력해준다.
Editor->SwiftFormat->Format File


내용은 오른쪽 사진 부분을 참고하면 이해하기 편하다.
여기서 SwiftFormat은 3가지 옵션을 제공한다.
1. Format Selection
- 선택된 코드(드래그 등으로)에 대해서만 포맷팅 진행
2. Format File 🤩(얘를 기본으로 쓸꺼임 cmd + S)
- 현재 파일 전체를 포맷팅
3. Lint File
- 현재 파일의 린트(warning)만 진행하고, 포맷팅은 진행하지 않는다.
🧪 테스트
한번 테스트 해보자.
나는 swiftFormat 기능 중 많이 쓰는 것이 바로
import를 내림찬순으로 바꿔주는 내용이다.

음 잘 바뀌는군..
🛜 공유
나 혼자하는 프로젝트면 바로 당장 써도 문제가 없지만, 다른 팀원과 같은 포맷으로 프로젝트를 진행하고 싶으면
위에서 작성한 .swiftformat파일을 공유한 후, 다음과 같이 열어서 저장하면 됨.

😀 소감 및 마무리
이제는 SwifrFormat 세팅으로 고통받지 말자..
출처
https://velog.io/@3436rngus/Xcode-Format-On-Save-%EC%84%A4%EC%A0%95
[Xcode] swiftformat-for-xcode 설치 / 설정 / 삭제
Xcode Swift formatter with SwiftFormat
velog.io