목차
StyleShare 구성원들이 Swift 코드를 이해하기 쉽고 명확하게 작성하기 위한 스타일 가이드입니다. 구성원들의 의사결정에 따라 수시로 변경될 수 있습니다.
본 문서에 나와있지 않은 규칙은 아래 문서를 따릅니다.
들여쓰기에는 탭(tab) 대신 2개의 space를 사용합니다.
콜론(:)을 쓸 때에는 콜론의 오른쪽에만 공백을 둡니다.
let names: [String: String]?
연산자 오버로딩 함수 정의에서는 연산자와 괄호 사이에 한 칸 띄어씁니다.
func ** (lhs: Int, rhs: Int)
빈 줄에는 공백이 포함되지 않도록 합니다.
모든 파일은 빈 줄로 끝나도록 합니다.
MARK 아래에는 공백이 필요합니다.
// MARK: Layout
override func layoutSubviews() {
// doSomething()
}
// MARK: Actions
override func menuButtonDidTap() {
// doSomething()
}
모듈 임포트는 알파벳 순으로 정렬합니다. 내장 프레임워크를 먼저 임포트하고, 빈 줄로 구분하여 서드파티 프레임워크를 임포트합니다.
import UIKit
import SwiftyColor
import SwiftyImage
import Then
import URLNavigator
함수 이름에는 lowerCamelCase를 사용합니다.
함수 이름 앞에는 되도록이면 get을 붙이지 않습니다.
좋은 예:
func name(for user: User) -> String?
나쁜 예:
func getName(for user: User) -> String?
상수 이름에는 lowerCamelCase를 사용합니다.
좋은 예:
let maximumNumberOfLines = 3
나쁜 예:
let kMaximumNumberOfLines = 3
let MAX_LINES = 3
enum의 각 case에는 lowerCamelCase를 사용합니다.
좋은 예:
enum Result {
case .success
case .failure
}
나쁜 예:
enum Result {
case .Success
case .Failure
}
약어로 시작하는 경우 소문자로 표기하고, 그 외의 경우에는 항상 대문자로 표기합니다.
좋은 예:
let userID: Int?
let html: String?
let websiteURL: URL?
let urlString: String?
나쁜 예:
let userId: Int?
let HTML: String?
let websiteUrl: URL?
let URLString: String?
클래스와 구조체 내부에서는 self를 명시적으로 사용합니다.
구조체를 생성할 때에는 Swift 구조체 생성자를 사용합니다.
좋은 예:
let frame = CGRect(x: 0, y: 0, width: 100, height: 100)
나쁜 예:
let frame = CGRectMake(0, 0, 100, 100)
Array<T>와 Dictionary<T: U> 보다는 [T], [T: U]를 사용합니다.
좋은 예:
var messages: [String]?
var names: [Int: String]?
나쁜 예:
var messages: Array<String>?
var names: Dictionary<Int, String>?
///를 사용해서 문서화에 사용되는 주석을 남깁니다.
/// 사용자 프로필을 그려주는 뷰
class ProfileView: UIView {
/// 사용자 닉네임을 그려주는 라벨
var nameLabel: UILabel!
}
// MARK:를 사용해서 연관된 코드를 구분짓습니다.
Objective-C에서 제공하는 #pragma mark와 같은 기능으로, 연관된 코드와 그렇지 않은 코드를 구분할 때 사용합니다.
// MARK: Init
override init(frame: CGRect) {
// doSomething()
}
deinit {
// doSomething()
}
// MARK: Layout
override func layoutSubviews() {
// doSomething()
}
// MARK: Actions
override func menuButtonDidTap() {
// doSomething()
}
상수를 정의할 때에는 enum를 만들어 비슷한 상수끼리 모아둡니다. 재사용성과 유지보수 측면에서 큰 향상을 가져옵니다. struct 대신 enum을 사용하는 이유는, 생성자가 제공되지 않는 자료형을 사용하기 위해서입니다. CGFloatLiteral과 SwiftyColor를 사용해서 코드를 단순화시킵니다.
final class ProfileViewController: UIViewController {
private enum Metric {
static let profileImageViewLeft = 10.f
static let profileImageViewRight = 10.f
static let nameLabelTopBottom = 8.f
static let bioLabelTop = 6.f
}
private enum Font {
static let nameLabel = UIFont.boldSystemFont(ofSize: 14)
static let bioLabel = UIFont.boldSystemFont(ofSize: 12)
}
private enum Color {
static let nameLabelText = 0x000000.color
static let bioLabelText = 0x333333.color ~ 70%
}
}
이렇게 선언된 상수들은 다음과 같이 사용될 수 있습니다.
self.profileImageView.frame.origin.x = Metric.profileImageViewLeft
self.nameLabel.font = Font.nameLabel
self.nameLabel.textColor = Color.nameLabelText
본 문서는 크리에이티브 커먼즈 저작자표시 4.0 국제 라이센스에 따라 이용할 수 있으며, 저작권은 전수열과 StyleShare에게 있습니다.