-
Notifications
You must be signed in to change notification settings - Fork 1
iOS 코드 스타일 가이드
김영균 edited this page Nov 17, 2023
·
4 revisions
- 클래스와 구조체의 이름은 UpperCamelCase를 사용합니다.
- 클래스 이름에는 접두사(Prefix)를 붙이지 않습니다.
- 무엇을 만드는 팩토리 메서드의 접두사는
make
를 사용합니다. -
self
는 필요할 때만 사용합니다. - 함수명 혹은 프로퍼티가 가려질 때만
self
를 사용합니다. - 뷰 레이아웃 메서드는 아래와 같은 네이밍으로 작성합니다.
func setViewAttributes() {} func setViewHierarchies() {} func setViewConstraints() {}
- UI 컴포넌트는 프로퍼티로 생성을 한다음,
setAtrributes()
에서 속성을 정의합니다. - UI 컴포넌트는 타입을 지정하고
.init
으로 생성합니다. -
required init?(coder: NSCoder)
에는@available(*, unavailable)
을 붙여 코드베이스 환경을 지킵니다.@available(*, unavailable) required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") }
-
private
메서드는extension
에 작성합니다. - bind 메서드 extension, ui 관련 메서드 extension, delegate extension 처럼 extension을 사용하여 구분합니다.
- 프로토콜은 익스텐션에서 채택하고 준수합니다.
- 확장 파일은 Publisher+Operator 형식을 따릅니다.
- list, array 같은 네이밍은 지양, 복수형 사용 지향합니다.
- 액션 함수의 네이밍은 '주어 + 동사 + 목적어' 형태를 사용합니다.
- (Tap(눌렀다 뗌)*은
UIControlEvents
의.touchUpInside
에 대응하고, *Press(누름)*는.touchDown
에 대응합니다. -
will
은 특정 행위가 일어나기 직전이고,did
는 특정 행위가 일어난 직후입니다. -
should
는 일반적으로Bool
을 반환하는 함수에 사용됩니다. -
myCollectionViewDidTap
과 같이didTap
을 뒤에 작성합니다.
- 약어는 소문자로 표기합니다.
let userId: Int? let html: String? let websiteUrl: URL? let urlString: String?
- 변수에 접미사로 뷰의 타입을 붙입니다.
- Array와 Dictionary<T: U> 보다는 [T], [T: U]를 사용합니다.
- 상수를 정의할 때에는 enum를 만들어 비슷한 상수끼리 모아둡니다. 재사용성과 유지보수 측면에서 큰 향상을 가져옵니다. struct 대신 enum을 사용하는 이유는, 생성자가 제공되지 않는 자료형을 사용하기 위해서입니다
-
들여쓰기는 탭을 사용하며 2개의 스페이스로 이루어져있습니다.
-
콜론(:)을 쓸 때에는 콜론의 오른쪽에만 공백을 둡니다.
let names: [String: String]?
- 한 줄은 최대 120자를 넘지 않아야합니다.
- 함수 정의가 최대 길이를 초과하는 경우에는 아래와 같이 줄바꿈합니다.
// 출처 : https://github.com/StyleShare/swift-style-guide func collectionView( _ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath ) -> UICollectionViewCell { // doSomething() } func animationController( forPresented presented: UIViewController, presenting: UIViewController, source: UIViewController ) -> UIViewControllerAnimatedTransitioning? { // doSomething() }
- 함수를 호출하는 코드가 최대 길이를 초과하는 경우에는 파라미터 이름을 기준으로 줄바꿈합니다.
// 출처 : https://github.com/StyleShare/swift-style-guide let actionSheet = UIActionSheet( title: "정말 계정을 삭제하실 건가요?", delegate: self, cancelButtonTitle: "취소", destructiveButtonTitle: "삭제해주세요" )
- 단, 파라미터에 클로저가 2개 이상 존재하는 경우에는 무조건 내려쓰기합니다.
// 출처 : https://github.com/StyleShare/swift-style-guide UIView.animate( withDuration: 0.25, animations: { // doSomething() }, completion: { finished in // doSomething() } )
-
if let
구문이 길 경우에는 줄바꿈하고 한 칸 들여씁니다.// 출처 : https://github.com/StyleShare/swift-style-guide if let user = self.veryLongFunctionNameWhichReturnsOptionalUser(), let name = user.veryLongFunctionNameWhichReturnsOptionalName(), user.gender == .female { // ... }
-
guard let
구문이 길 경우에는 줄바꿈하고 한 칸 들여씁니다.else
는guard
와 같은 들여쓰기를 적용합니다.// 출처 : https://github.com/StyleShare/swift-style-guide guard let user = self.veryLongFunctionNameWhichReturnsOptionalUser(), let name = user.veryLongFunctionNameWhichReturnsOptionalName(), user.gender == .female else { return }
- 모든 파일은 빈 줄로 끝나도록 합니다.
- MARK 구문 위는 공백이 필요하며 MARK 구문은 아래에 붙여 사용합니다.
- 임포트는 알파벳 순으로 정렬합니다.
- [ADR] 아키텍처 의사 결정 기록: iOS 애플리케이션 아키텍처 채택하기
- [ADR] 아키텍처 의사 결정 기록: SwiftLint 채택
- [ADR] 아키텍처 의사 결정 기록: UI 영역에서 Combine 사용 결정
- [ADR] 아키텍처 의사 결정 기록: Presentation영역의 ViewModel에서 Input Output 패턴 도입 결정
- [ADR] 아키텍처 의사 결정 기록: 코디네이터 패턴 도입 결정
- [ADR] 아키텍처 의사 결정 기록: 로컬 스토리지로 코어 데이터 사용 결정
- [ADR] 아키텍처 의사 결정 기록: Custom Network Foundation 라이브러리 구현 및 모듈화 결정
- [ADR] 아키텍처 의사 결정 기록: 이미지캐셔 라이브러리 구현 및 모듈화 결정