#Secion01 - Code Convention
Introduce
소프트웨어 개발의 80%는 유지보수에 집중된다. 유지보수 과정에서 가독성 높은 코드는 코드 리뷰 및 협업에 유용하다.
위와같은 목적을 위해 본 프로젝트는 Swift API Design Guidelines을 참고한 다음 코드 컨벤션을 준수한다.
네이밍
클래스(타입, 프로토콜 이름 포함) 이름에는 UpperCamelCase(첫 문자를 대문자로 시작하는 camel 표기법), 함수 이름에는 camelCase를 사용한다.
변수, 상수
일반 변수 / 상수인 경우 별도의 접두사를 붙이지 않는다.
let maximumNumberOfLines = 3 // ✅ Preferred
let kMaximumNumberOfLines = 3 // ⛔️ Not Preferred
let MAX_LINES = 3 // ⛔️ Not Preferred
static
전역 변수 / 상수인 경우 앞에 k를 붙여준다.
static let kMaximumNumberOfLines = 3 // ✅ Preferred
let kMaximumNumberOfLines = 3 // ⛔️ Not Preferred
함수01
함수, 메서드 이름에는 되도록 get을 붙이지 않는다.
func name(for user: User) -> String? // ✅ Preferred
func getName(for: user: User) -> String? // ⛔️ Not Preferred
함수02
액션 함수의 네이밍은 “주어 + 동사 + 목적어” 형태를 사용한다.
will은 특정 행위가 일어나기 진전이며, did는 특정 행위가 일어난 직후이다.
func backButtonDidTap() { } // ✅ Preferred
func back() { } // ⛔️ Not Preferred
func pressBack() { } // ⛔️ Not Preferred
약어
약어로 시작하는 경우 소문자로 표기하고, 그 외 경우에는 항상 대문자로 표기한다.
let userID: Int? // ✅ Preferred
let html: String? // ✅ Preferred
let websiteURL: URL? // ✅ Preferred
let urlString: String? // ✅ Preferred
let userId: Int? // ⛔️ Not Preferred
let HTML: String? // ⛔️ Not Preferred
let websiteUrl: NSURL? // ⛔️ Not Preferred
let URLString: String? // ⛔️ Not Preferred
타입
Array<T>와 Dictionaray<T: U> 보다는 [T], [T: U]를 사용한다.
var message: [String]? // ✅ Preferred
var names: [Int: String] // ✅ Preferred
var message: Array<String>? // ⛔️ Not Preferred
var names: Dictionary<Int, String>? // ⛔️ Not Preferred
self
문법의 모호함을 제거하기 위해 언어에서 필수로 요구하지 않는 이상 self 프로퍼티는 사용하지 않는다.
final class Listing {
private let isFimilyFriendly: Bool
private var capacity: Int
init(capacity: Int, allowsPets: Bool) {
self.capacity = capacity // ✅ Preferred
isFamilyFriendly = !allowsPets
self.capacity = capacity
self.isFamilyFriendly = !allowsPets // ⛔️ Not Preferred
}
}
패턴
프로퍼티의 초기화는 가능하면 init에서하고 가능하면 Unwrapped Optional의 사용을 지양한다.
class SomeClass: NSObject { // ✅ Preferred
var someValue: Int
init() {
someValue = 0
super.init()
}
}
class MyClass: NSObject { // ⛔️ Not Preferred
var someValue: Int?
init() {
super.init()
}
}
return
return은 생략하지 않는다.
// ✅ Preferred
["1", "2", "3"].compactMap { return Int($0) }
var size: CGSize {
return CGSize(
width: 100.0,
height: 100.0)
}
func makeInfoAlert(message: String) -> UIAlertController {
return UIAlertController(
title: "ℹ️ Info",
message: message,
preferredStyle: .alert)
}
// ⛔️ Not Preferred
["1", "2", "3"].compactMap { Int($0) }
var size: CGSize {
CGSize(
width: 100.0,
height: 100.0)
}
func makeInfoAlert(message: String) -> UIAlertController {
UIAlertController(
title: "ℹ️ Info",
message: message,
preferredStyle: .alert)
}