Skip to content

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 구문이 길 경우에는 줄바꿈하고 한 칸 들여씁니다. elseguard와 같은 들여쓰기를 적용합니다.
    // 출처 : https://github.com/StyleShare/swift-style-guide
    guard let user = self.veryLongFunctionNameWhichReturnsOptionalUser(),
          let name = user.veryLongFunctionNameWhichReturnsOptionalName(),
          user.gender == .female
    else {
      return
    }

기타

빈 줄

  • 모든 파일은 빈 줄로 끝나도록 합니다.
  • MARK 구문 위는 공백이 필요하며 MARK 구문은 아래에 붙여 사용합니다.

임포트

  • 임포트는 알파벳 순으로 정렬합니다.

오리들의 애자일한 개발 여정

📜 기획

💢 규칙

🐥 1주차 회의록, 회고

데일리 스크럼

회의록

회고

🐥 2주차 회의록, 회고

데일리 스크럼

회의록

회고

🐥 3주차 회의록, 회고

데일리 스크럼

회고

🐥 4주차 회의록, 회고

데일리 스크럼

회고

🐥 5주차 회의록, 회고

데일리 스크럼

회고

🐥 6주차 회의록, 회고

데일리 스크럼

회고

🍎 iOS

아키텍처 의사 결정 기록

Clone this wiki locally