-
Notifications
You must be signed in to change notification settings - Fork 3
☁️ Code Convention
StyleShare - swift style guide를 기본으로 해서 추가하거나 수정하였습니다.
SwiftLint 를 통해서 통일성있는 클린코드를 추구합니다.
코드리뷰 간 커뮤니케이션 코스트를 줄이기 위해 Swift Lint를 통해 컨벤션을 체크합니다.
- 들여쓰기에는 탭(tab) 대신 4개의 space를 사용합니다.
- 콜론(
:)을 쓸 때에는 콜론의 오른쪽에만 공백을 둡니다. - 연산자 오버로딩 함수 정의에서는 연산자와 괄호 사이에 한 칸 띄어씁니다.
let names: [String: String]?
func ** (lhs: Int, rhs: Int)-
함수를 호출하는 코드가
최대 길이를 초과하는 경우에는 파라미터 이름을 기준으로 줄바꿈합니다. → 파라미터가 3개 이상이면 줄바꿈하도록!!let actionSheet = UIActionSheet(title: "정말 계정을 삭제하실 건가요?", delegate: self, cancelButtonTitle: "취소", destructiveButtonTitle: "삭제해주세요")
단, 파라미터에 클로저가 2개 이상 존재하는 경우에는 무조건 내려쓰기합니다.
UIView.animate( withDuration: 0.25, animations: { // doSomething() }, completion: { finished in // doSomething() } )
- UpperCamelCase 사용
-
lowerCamelCase 사용하고
동사로 시작
- pop, push, present, dismiss
- 동사 + To + 목적지 뷰 (다음에 보일 뷰)
- dismiss는 dismiss + 현재 뷰
register
- register + 목적어 ex) registerXib
ex) registerCell()
setDelegate()
서버통신
- 서비스함수명 + API ex) fetchListAPI
- fetch는 무조건 성공
- request는 실패할 수도 있는 요청
- lowerCamelCase 사용
- 각 case 에는 lowerCamelCase 사용
setUI() : 컴포넌트 UI 속성 설정
setLayout() : 레이아웃 관련 코드
initCell() : 셀 데이터 초기화
setData() : 배열 항목 세팅. 컬렉션뷰에서 리스트 초기 세팅할때
registerXib() : 셀 xib 등록.
setCollectionView() : 컬렉션뷰 관련 세팅
setTableView() : 테이블뷰 관련 세팅
setDelegate() : delegate, datasource 모음
setAddTarget() : addtarget 모음
setNotification() : NotificationCenter addObserver 모음 -
빈 줄에는 공백이 포함되지 않도록 합니다.
-
모든 파일은 빈 줄로 끝나도록 합니다.
-
MARK 구문 위와 아래에는 공백이 필요합니다.// MARK: Layout override func layoutSubviews() { // doSomething() } // MARK: Actions override func menuButtonDidTap() { // doSomething() }
모듈 임포트는 알파벳 순으로 정렬합니다. 내장 프레임워크를 먼저 임포트하고, 빈 줄로 구분하여 서드파티 프레임워크를 임포트합니다.
import UIKit
import SwiftyColor
import SwiftyImage
import Then
import URLNavigator-
파라미터와 리턴 타입이 없는 Closure정의시에는() -> Void를 사용합니다.좋은 예:
let completionBlock: (() -> Void)?나쁜 예:
let completionBlock: (() -> ())?let completionBlock: ((Void) -> (Void))? -
Closure 정의시 파라미터에는 괄호를 사용하지 않습니다.
좋은 예:
{ operation, responseObject in // doSomething() }
나쁜 예:
{ (operation, responseObject) in // doSomething() }
-
Closure 정의시
가능한 경우 타입 정의를 생략합니다.좋은 예:
..., completion: { finished in // doSomething() }
나쁜 예:
..., completion: { (finished: Bool) -> Void in // doSomething() } completion: { data -> Void in // doSomething() } (X)
-
Closure 호출시 또다른 유일한 Closure를 마지막 파라미터로 받는 경우, 파라미터 이름을 생략합니다.
좋은 예:
UIView.animate(withDuration: 0.5) { // doSomething() }
나쁜 예:
UIView.animate(withDuration: 0.5, animations: { () -> Void in // doSomething() })
코드는 가능하면 자체적으로 문서가 되어야 하므로, 코드와 함께 있는 인라인(inline) 주석은 피한다.
// MARK: - Properties
// MARK: - UI Components
// MARK: - View Life Cycle
// MARK: - Methods (Extension)
> setUI, registerXib, assignDelegate 등
// MARK: - @objc Methods
// MARK: - Network
> 네트워크 목적을 가진 함수들
UICollectionViewDelegate, UICollectionViewDatsource 등 시스템 프로토콜
프로토콜을 적용할 때에는 extension을 만들어서 관련된 메서드를 모아둡니다.
좋은 예:
final class MyViewController: UIViewController {
// ...
}
// MARK: - UITableViewDataSource
extension MyViewController: UITableViewDataSource {
// ...
}
// MARK: - UITableViewDelegate
extension MyViewController: UITableViewDelegate {
// ...
}나쁜 예:
final class MyViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
// ...
}
// 프로토콜 여러개를 한곳에 몰아서 때려넣지 말자!-
self는 최대한 사용을 지양 →알잘딱깔센 self… -
viewDidLoad()에서는 함수호출만 - delegate 지정, UI관련 설정 등등 모두 함수와 역할에 따라서 extension 으로 빼기
- 필요없는 주석 및 Mark 구문들 제거