Apple Developer Academy의 개발자들이 따르고 있는 스위프트 스타일 가이드입니다. 다른 사람의 코드를 읽을 때 가독성을 높여주며, 내가 코드를 작성할 때 애매한 부분을 제거해줘 생산성 향상에 도움을 줍니다!
취향에 문제가 많기 때문에 코드를 작성하는데 어려움이 생긴다면 PR을 통해 언제나 의견을 주세요.
기여를 하고싶으신 분들을 위한 가이드는 컨트리뷰션 가이드라인을 참고해주세요.
- 변수 이름은
lowerCamelCase
를 사용해주세요. - 배열과 같이 복수의 의미를 담고있는 변수라면 끝에 s를 붙여서 사용해주세요.
- Good ✅
var categories: [String] var person: Person var isShowing: Bool
- Bad ❌
var category: [String] var show: Bool
- Good ✅
- 함수 이름에는
lowerCamelCase
를 사용해주세요. - 함수는 일반적으로 동사원형으로 시작해주세요.
- Event-Handling 함수의 경우 (조동사 + 동사원형)으로 시작해주세요. 주어는 유추 가능하다면, 생략 가능합니다.
- will은 특정 행위가 일어나기 직전을 의미합니다.
- did는 특정 행위가 일어난 직후를 의미합니다.
- Good ✅
class AcademyViewController { private func didFinishSession() { // ... } private func willFinishSession() { // ... } private func scheduleDidChange() { // ... } }
- Bad ❌
class AcademyViewController { private func handleSessionEnd() { // ... } private func finishSession() { // ... } private func scheduleChanged() { // ... } }
- 데이터를 가져오는 함수의 경우,
get
사용을 지양하고request
,fetch
을 적절하게 사용해주세요.request
: 에러가 발생하거나, 실패할 수 있는 비동기 작업에 사용합니다.fetch
: 요청이 실패하지 않고 결과를 바로 반환할 때 사용합니다.- Good ✅
func reqeustData(for user: User) -> Data? func fetchData(for user: User) -> Data
- Bad ❌
func getData(for user: User) -> Data?
- 열거형의 이름은
UpperCamelCase
를 사용해주세요. - 열거형의 각 case에는
lowerCamelCase
를 사용해주세요.- Good ✅
enum Result { case .success case .failure }
- Bad ❌
enum result { case .Success case .Failure }
- Good ✅
- 구조체와 클래스의 이름은
UpperCamelCase
를 사용해주세요. - 구조체와 클래스의 프로퍼티 및 메소드는
lowerCamelCase
를 사용해주세요.- Good ✅
struct LeftRectangle { var width: Int var height: Int func drawRectangle() { // ... } }
class Mentee { let id: String let session: String var group: Int var team: Int func callOutMentor() { // ... } }
- Bad ❌
struct rightRectangle { var Width: Int var Height: Int func DrawRectangle() { // ... } }
class mentor { let Id: String var Group: Int func GiveAdvice() { // ... } }
- Good ✅
주석은 협업에 있어 가독성을 높이고 다른 사람의 코드를 이해하는 중요한 도구입니다.
-
설명은 최대한 간결하고 핵심 요약에 집중해서 작성해주세요.
-
함수와 메소드는 기본적으로 무엇을 하는지 무엇을 반환하는지 설명해주시고,
널효과나 void 반환은 생략합니다. -
작성한 주석은 퀵헬프 메뉴에서 언제든지 조회가 가능합니다.
-
Good ✅
/// 사용자 데이터를 추가합니다. /// - Parameter name: user fullname /// - Parameter age: user age func addData(name: String, age: Int) { // code to add data... }
/// DB내 사용자 이름과 ID로 나이를 조회합니다. /// - Parameter ID: user ID /// - Parameter name: user fullname /// - Returns: user age func readData(ID: Int, name: String) { var age: Int // code to read data... return age }
-
Bad ❌
// 사용자 데이터 추가 func addData(name: String, age: Int) { // return void }
-
-
연관된 코드가 있다면 MARK를 사용하여 코드영역을 구분지는것을 권장합니다.
- Example 💡
// MARK: - Gryffindor let password = "Fotuna Major" struct Gryffindor { let harry: String let ron: String let hermione: String } // MARK: - Slytherin class Slytherin { let voldemort: String let malfoy: String func deadlyCurse() { print("Avada Kedavra!") } }
- Example 💡
-
아직 개발이 완료되지 않은 코드가 있다면 TODO나 FIXME를 사용하여 체크하는 것도 좋습니다.
- Example 💡
// FIXME: - 버그 수정 필요 public func buggyFunc() { // buggy code.. } // TODO: - 문자열 인코딩 함수 작업 계획 private func todoFunc() { // tbd..
- Example 💡
- 인덴테이션은 스페이스바 4개를 기본으로 하되, 스페이스바 4개는 탭 1개의 역할을 합니다.
- Good ✅
func sayHiLeeo(isHappy: Bool) { if isHappy { print("Hi Leeo!") } }
- Bad ❌
func sayHiLeeo(isHappy: Bool) { if isHappy { print("Hi Leeo!") } }
- Good ✅
- 콜론(
:
)을 사용할 땐 콜론의 오른쪽으로 한 칸의 여백을 생성합니다. 콜론의 왼쪽은 공백없이 코드를 작성합니다.- Example 💡
let leeo: HappyLeeo
- Example 💡
- 컴팩트 코드를 선호하고 컴파일러가 단일 인스턴스의 상수나 변수의 타입을 추론하도록 합니다.
- 필요한 경우
CGFloat
나Int64
와 같은 경우는 특정 타입을 지정해줍니다.-
Good ✅
let apple = "Developer" let book1 = Book() let age = 25 let frameWidth: CGFloat = 120
-
Bad ❌
let apple: String = "Developer" let book1: Book = Book() let age: Int = 25
-
-
전체 제네릭 구문
Array<T>
와Dictionary<T: U>
보다는 단축 구문[T]
,[T: U]
를 사용합니다.-
Good ✅
var student: [String: String]? var students: [String]?
-
Bad ❌
var student: Dictionary<String, String>? var students: Array<String>?
-
-
빈 배열과 딕셔너리 선언 시, 타입을 명시하는 것을 선호합니다.
-
Good ✅
var student: [String: String] = [:] var students: [String] = []
-
Bad ❌
var student = [String: String]() var students = [String]()
-