// MARK: - Property
// MARK: - View
// MARK: - Life cycle
// MARK: - Private
// MARK: - Public
프로퍼티가 없는 프로토콜을 채택할 경우, extension을 활용해 채택한다.
프로퍼티가 있는 프로토콜을 채택할 경우, (어쩔 수 없지) 객체 첫 정의부에 채택한다.
작성 순서는 typealias - let 혹은 var - ui 요소(IBOutlet, lazy var) - init - viewDidLoad - 이후 메서드
super 앞뒤로는 한칸씩 개행한다.
self는 불가피한 경우(클로저 내부 self 캡처, 이니셜라이저)가 아니면 써 주지 않는다.
private과 final을, 꼭 필요한 다른 곳이 있는 것이 아니라면 무조건 붙인다.
네이밍의 일관성 - 기본적으로 프로퍼티는 명사, 메서드는 동사. 메서드는 한 번에 한 가지 동작만 하게끔 설계한다. 동작이 두 가지 이상일 경우 가급적 별도의 메서드로 분리.
매직 넘버는 가급적 네임스페이스로 빼 주기 - 기획자의 변덕으로 바뀔 수 있는 앱의 정책 관련된 매직넘버에 항상 유의하자!
extension UIColor {
static let mfBlack = UIColor.black
static let mfRed = UIColor.red
static let mfLightGray = UIColor.systemGray2
static let mfWhite = UIColor.white
static let mfDarkGray = UIColor(red: 66/255, green: 66/255, blue: 66/255, alpha: 1)
}
enum BaseURL {
static let string = "<http://mynf.codershigh.com:8080>"
}
class ViewController: UIViewController {
private enum Metric {
static let stackViewSpacing: CGFloat = 20
static let imageWidth: CGFloat = 200
static let imageHeight: CGFloat = 200
static let buttonWidth: CGFloat = 100
static let buttonHeight: CGFloat = 40
static let buttonRadius: CGFloat = 10
}
}
extension은 일단 +만 붙여서 작성.
guard let … else { return } 을 사용할 경우, return만 있을 경우는 공백 1칸 후 return 작성해 주고, 내용이 있을 경우 1줄 개행한 뒤 return을 작성한다.
guard let이나 if let을 사용할 때, 여러 조건을 검증해야 할 경우 조건 하나당 한 줄에 작성하고 개행한다.
메서드 내부는 다 붙여 쓰지만 말고, 가독성을 고려해 개행한다.
전달 인자 레이블에 대해 신경쓴다. 코드 작성시 가독성을 고려해 한번 더 생각해본다.
메서드의 사용, 라이브러리의 import 순서 등은 알파벳 순서를 따른다. 내장 라이브러리를 먼저 import하고 서드 파티 라이브러리를 import한다.