Skip to content

Coding Convention

HEE / 정은희 edited this page Jul 17, 2022 · 2 revisions

👻 StyleShare - swift style guide 을 참고하여 함께 토의했으며, 필요한 부분만 채택하였습니다.


✨ 코드 레이아웃

1. 들여쓰기 및 띄워쓰기

  • 콜론(:)을 쓸 때에는 콜론의 오른쪽에만 공백을 둡니다.
let names: [String: String]?

2. 줄바꿈

  • 함수를 호출하는 코드가 최대 길이를 초과하는 경우에는 파라미터 이름을 기준으로 줄바꿈합니다.
let actionSheet = UIActionSheet(
  title: "정말 계정을 삭제하실 건가요?",
  delegate: self,
  cancelButtonTitle: "취소",
  destructiveButtonTitle: "삭제해주세요"
)
  • 단, 파라미터에 클로저가 3개 이상 존재하는 경우에는 무조건 내려쓰기합니다.
UIView.animate(
  withDuration: 0.25,
  animations: {
    // doSomething()
  },
  completion: { finished in
    // doSomething()
  }
)
  • if let 구문이 길 경우에는 줄바꿈하고 한 칸 들여씁니다.
if let user = self.veryLongFunctionNameWhichReturnsOptionalUser(),
  let name = user.veryLongFunctionNameWhichReturnsOptionalName(),
  user.gender == .female {
  // ...
}
  • guard let 구문이 길 경우에는 줄바꿈하고 한 칸 들여씁니다. else는 guard와 같은 들여쓰기를 적용합니다.
guard let user = self.veryLongFunctionNameWhichReturnsOptionalUser(),
  let name = user.veryLongFunctionNameWhichReturnsOptionalName(),
  user.gender == .female
else {
  return
}

ㄱ. 최대 줄 길이

  • 한 줄은 최대 99자를 넘지 않아야 합니다.

    • Xcode의 Preferences → Text Editing → Display의 'Page guide at column' 옵션을 활성화하고 99자로 설정하면 편리합니다.

ㄴ. 임포트

  • 모듈 임포트는 알파벳 순으로 정렬합니다. 내장 프레임워크를 먼저 임포트하고, 빈 줄로 구분하여 서드파티 프레임워크를 임포트합니다.
import UIKit

import SwiftyColor
import SwiftyImage
import Then
import URLNavigator

✨ 네이밍

1. 클래스

  • 클래스 이름에는 UpperCamelCase를 사용합니다.
  • 클래스 이름에는 접두사Prefix를 붙이지 않습니다.

2. 함수

  • 함수 이름에는 lowerCamelCase를 사용합니다.
  • 함수 이름 앞에는 되도록이면 get을 붙이지 않습니다.

좋은 예:

func name(for user: User) -> String?

나쁜 예:

func getName(for user: User) -> String?

3. 변수

  • 변수 이름에는 lowerCamelCase를 사용합니다.

4. 상수

  • 상수 이름에는 lowerCamelCase를 사용합니다.

    • 좋은 예
    let maximumNumberOfLines = 3
    • 나쁜 예
    let MaximumNumberOfLines = 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: NSURL?
    let URLString: String?

5. Delegate

  • Delegate 메서드는 프로토콜명으로 네임스페이스를 구분합니다.

    • 좋은 예
    protocol UserCellDelegate {
      func userCellDidSetProfileImage(_ cell: UserCell)
      func userCell(_ cell: UserCell, didTapFollowButtonWith user: User)
    }
    • 나쁜 예
    protocol UserCellDelegate {
      func didSetProfileImage()
      func followPressed(user: User)
    
      // `UserCell`이라는 클래스가 존재할 경우 컴파일 에러 발생
      func UserCell(_ cell: UserCell, didTapFollowButtonWith user: User)
    }

6. 클로저, 클래스와 구조체, 타입, 프로그래밍 권장 사항

  • 그대로 채택

✨ 주석

  • //를 사용해서 다른 팀원의 참고용으로 표시할 주석을 남깁니다. 코드를 알아보기 어렵다고 예측되는 곳에만 주석을 표시합니다.

    • 예시
    // 사용자 프로필을 그려주는 뷰
    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()
    }