해당 문서는 DevTilDie 팀이 작성한 Swift 스타일 가이드입니다.
-
라인 수는 최대 100줄을 넘기지 않습니다.
✅ Xcode → Preferences → Text Editing → `Page guide at column: 100`예외
ⅰ. 수정되거나 생략되어서는 안 되는 의미 있는 텍스트
ⅱ.import문
ⅲ. 다른 도구에서 생성된 코드 -
파일은 빈 줄로 끝나야 합니다.
-
파일은 UTF-8로 인코딩되어야 합니다.
-
파일명은 클래스 이름을 사용합니다.
- extension의 경우,
타입+형태로 파일 이름을 작성합니다.
- extension의 경우,
- 모듈은 파일의 헤더 주석 아래에 기재합니다.
- 첫 번째 모듈 선언문 위와 마지막 모듈 선언문 아래에는 빈 줄을 추가합니다.
- 내장 프레임워크와 third-party 프레임워크를 구분하여 알파벳 순서로 정렬합니다.
- 변수는 다음과 같은 순서로 구분(빈 줄 추가)하여 정렬합니다.
- 클로저를 가진 경우, 동일한 종류의 선언 집합 끝에 작성합니다.
// Property Wrapper
@Environment
@StateObject
@ObservableObservable
@FetchRequest
// State & Binding
@State
@Binding
// 변수 & 상수
private var
private let
var
let- 빈 줄에는 공백을 넣지 않습니다.
- 모든 파일은 빈 줄로 끝납니다.
- 들여쓰기는 공백 4칸을 사용합니다.
- Xcode에서
^+i를 눌렀을 때, 적용되는 space를 기준으로 합니다.
- Xcode에서
- 코드의 가로 길이는 100자를 넘기지 않습니다.
- 함수 선언이 길어질 경우, 각 인자 앞 혹은 반환 시그니처나
async,throws와 같은 효과 앞에서 줄바꿈을 해줍니다. - 삼항연산자가 길어질 경우,
?와:앞에서 줄바꿈을 해줍니다. - 조건문이 여러 줄로 작성될 경우, else 앞에서 줄바꿈을 해줍니다.
-
빈 중괄호(
{ })는 괄호 안에 공백 한 칸을 넣어줍니다. -
여는 중괄호 다음에 줄바꿈을 해줍니다.
예외
ⅰ. 클로저의 경우, 여는 중괄호가 시그니처를 같은 줄에 두고in키워드 다음에 줄바꿈을 해줍니다.
ⅱ. 여러 줄로 작성된 코드의 경우, 중괄호 앞에 줄바꿈을 해줍니다. -
닫는 중괄호 앞에 줄바꿈을 해줍니다.
- 모든 이름은 1글자로 짓지 않고, 약어만 사용하지 않습니다.
- 타입과 프로토콜은 PascalCase를, 그 외 나머지의 경우는 lowerCamelCase를 사용합니다.
- 타입, 프로퍼티, 변수, 상수의 경우 명사형을 사용합니다.
- 불리언 타입의 경우,
isEmpty,hasMember와 같이 작성합니다. - 어떤 것이 무엇인지를 설명하는 프로토콜의 이름은 명사형을 사용합니다.
- 이름은 가장 일반적인 부분이 앞에 오고, 특수한 부분이 뒤에 오게 작성합니다.
- 타입에 대한 힌트를 이름에 넣어야 합니다.
- 능력을 설명하는 프로토콜의 이름은 접미사
able,ible, 또는ing를 사용합니다.
- 되도록
get을 붙이지 않습니다. - 주어 + 동사 + 목적어의 구조를 갖습니다.
will= 행위가 일어나기 직전did= 행위가 일어난 직후should: 불리언 값을 반환하는 경우
- 이벤트를 처리하는 함수의 이름은 과거 시제를 사용하여 작성합니다.
-
약어를 사용할 경우, 전부 대문자로 작성합니다.
예외
약어가 이름의 맨 앞에 올 경우, lowerCamelCase를 따라 전부 소문자로 작성합니다. -
ViewController가 아니라면, 클래스의 이름을
*Controller와 같이 작성하지 않습니다.
- 반환 값이 없을 경우,
Void를 생략합니다. - 사용하지 않는 파라미터는
_로 표시합니다. - 인자가 없는 경우,
()와 같이 괄호 안에 공백을 넣지 않습니다.
- 반환 값이 없을 경우,
() → ()대신() → Void를 사용합니다. - 괄호 안에 줄바꿈을 추가하거나, 괄호 양쪽에 공백을 추가합니다.
- 사용하지 않는 파라미터는
_로 표시합니다. - 가독성을 위해 후행 클로저 사용을 권장합니다.
- 쉽게 타입을 추론할 수 있는 경우, 타입을 명시하지 않습니다.
Array<T>,Dictionary<T: U>보다는[T],[T: U]형태를 사용할 것을 권장합니다.
range를 제외한 중위표기법을 사용하는 연산자의 경우, 연산자 양쪽에 공백을 추가합니다.- 조건문에서는
&&대신,를 사용합니다.
- 명확성을 위해 멤버에 이름을 붙입니다.
- 필드가 3개 이상 넘어갈 경우,
struct를 사용합니다.
-
forEach보다는for를 사용합니다.예외
ⅰ.forEach가 다른 메소드와 결합하여 사용될 경우
ⅱ. View 내부에 작성된 경우
- 여러 줄로 작성된 경우, 마지막 요소 뒤에도
,를 작성합니다.
- 같은 이름으로 언래핑할 경우, 오른쪽 표현 (
==와 관련된 부분)은 생략합니다.
- 주석은
//(코드 관련)와///(문서화 관련)를 사용합니다. // MARK를 사용해서 연관된 코드 블록을 다른 코드 블록과 구분해 줍니다.- 특히, 익스텐션
- 서로 공유해야 하는 코드의 경우, 주석을 활용하여 문서화할 것을 권장합니다.