Skip to content
Hardy edited this page Jul 13, 2022 · 14 revisions

Git Convention

Commit Message

[label] issue_num : commit message

[feat] #2 : ํŒŒ๋„ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ ์šฉ
[bug] #4 : ํŒŒ๋„ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฌดํ•œ ๋ฐ˜๋ณต ํ˜„์ƒ
[fix] #5 : ํŒŒ๋„ ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฌดํ•œ ๋ฐ˜๋ณต ํ˜„์ƒ ํ•ด๊ฒฐ

'#' number : ์ด์Šˆ ๋ฒˆํ˜ธ

Label

bug : ๋ฒ„๊ทธ ๋ฐœ์ƒ ์‹œ

conflict : Pull Reqeust ์ƒ์„ฑ ํ›„ Conflict๋กœ Auto Merge๊ฐ€ ์ง„ํ–‰๋  ์ˆ˜ ์—†์„ ์‹œ

documentation : README.md, Git Template, commit message์— ์‚ฌ์šฉ ์‹œ, โ€˜docsโ€™๋กœ ์ถ•์•ฝ

feature : ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ตฌํ˜„

fix : ๋ฐฐํฌ๋˜์ง€ ์•Š์€ ๋ฒ„์ „์—์„œ์˜ ๊ตฌํ˜„๋œ feature ์ˆ˜์ • ๋ฐ ํ•ด๊ฒฐ

hotfix : ๋ฐฐํฌ ๋ฒ„์ „์—์„œ์˜ ๊ธด๊ธ‰ํ•œ ๋ฒ„๊ทธ ์ˆ˜์ • ๋ฐ ํ•ด๊ฒฐ

question : ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๋ชจ๋“  ์งˆ๋ฌธ

help : ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์ค‘ ๋„์›€์ด ํ•„์š”ํ•  ๋•Œ

reopen : ์ด์Šˆ & PR์ด ๋‹ค์‹œ ์—ด๋ ธ์„ ๋•Œ or ๋™์ผํ•œ ๋‚ด์šฉ์œผ๋กœ ์ƒˆ๋กœ ์˜ฌ๋ ธ์„ ๋•Œ

prepare : Research for about feature, ์ž‘์—…ํ•  ๋‚ด์šฉ์— ๋Œ€ํ•œ ํƒ์ƒ‰

refactor : ๋ฆฌํŽ™ํ† ๋งํ•  ๊ฒฝ์šฐ ์‚ฌ์šฉ

Git branch Flow

main : release๋กœ๋ถ€ํ„ฐ squash merge๋ฅผ ๋ฐ›๋Š” branch

release : develop์œผ๋กœ๋ถ€ํ„ฐ ์Šคํ”„๋ฆฐํŠธ ๋‹จ์œ„๋กœ merge๋ฅผ ๋ฐ›๋Š” branch

develop : ๊ฐœ์ธ feature branch๋กœ๋ถ€ํ„ฐ squash merge๋ฅผ ๋ฐ›๋Š” branch

feature : feature ๊ด€๋ จ๋œ ๋ธŒ๋žœ์น˜๋Š” ์ด๋ฆ„/feature์ด๋ฆ„์œผ๋กœ ์ƒ์„ฑ

labs: ์‹คํ—˜์‹ค ๋ธŒ๋žœ์น˜ ์ฃผ์š” feature๊ฐ€ ์•„๋‹Œ ์‹คํ—˜์ด ๋˜๋Š” ๊ธฐ๋Šฅ๋“ค์„ ์ถ”๊ฐ€ํ•ด๋ณด๋Š” branch, main branch์™€ ๋™๊ธฐํ™”

Code Convention

์ฝ”๋“œ ๋ ˆ์ด์•„์›ƒ

๋“ค์—ฌ์“ฐ๊ธฐ ๋ฐ ๋„์–ด์“ฐ๊ธฐ

  • ๋“ค์—ฌ์“ฐ๊ธฐ์—๋Š” ํƒญ(tab)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์ฝœ๋ก (:)์„ ์“ธ ๋•Œ์—๋Š” ์ฝœ๋ก ์˜ ์˜ค๋ฅธ์ชฝ์—๋งŒ ๊ณต๋ฐฑ์„ ๋‘ก๋‹ˆ๋‹ค.

    let names: [String: String]?

์ค„๋ฐ”๊ฟˆ

  • ํ•จ์ˆ˜ ์ •์˜๊ฐ€ ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ์ค„๋ฐ”๊ฟˆํ•ฉ๋‹ˆ๋‹ค.

    func collectionView(
      _ collectionView: UICollectionView,
      cellForItemAt indexPath: IndexPath
    ) -> UICollectionViewCell {
      // doSomething()
    }
    
    func animationController(
      forPresented presented: UIViewController,
      presenting: UIViewController,
      source: UIViewController
    ) -> UIViewControllerAnimatedTransitioning? {
      // doSomething()
    }
  • ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ฝ”๋“œ๊ฐ€ ์ตœ๋Œ€ ๊ธธ์ด๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์„ ๊ธฐ์ค€์œผ๋กœ ์ค„๋ฐ”๊ฟˆํ•ฉ๋‹ˆ๋‹ค.

    let actionSheet = UIActionSheet(
      title: "์ •๋ง ๊ณ„์ •์„ ์‚ญ์ œํ•˜์‹ค ๊ฑด๊ฐ€์š”?",
      delegate: self,
      cancelButtonTitle: "์ทจ์†Œ",
      destructiveButtonTitle: "์‚ญ์ œํ•ด์ฃผ์„ธ์š”"
    )
  • 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
    }

์ตœ๋Œ€ ์ค„ ๊ธธ์ด

  • ํ•œ ์ค„์€ ์ตœ๋Œ€ 120์ž๋ฅผ ๋„˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • ๋‹จ, if let, guard let ๊ตฌ๋ฌธ์€ ์ตœ๋Œ€ 70์ž๋กœ ์ œํ•œ

    Xcode์˜ย Preferences โ†’ Text Editing โ†’ Display์˜ 'Page guide at column' ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•˜๊ณ  120์ž๋กœ ์„ค์ •ํ•˜๋ฉด ํŽธ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

Import

๋ชจ๋“ˆ ์ž„ํฌํŠธ๋Š” ์•ŒํŒŒ๋ฒณ ์ˆœ์œผ๋กœ ์ •๋ ฌํ•ฉ๋‹ˆ๋‹ค.

๋‚ด์žฅ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋จผ์ € ์ž„ํฌํŠธํ•˜๊ณ , ๋นˆ ์ค„๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ์„œ๋“œํŒŒํ‹ฐ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ž„ํฌํŠธํ•ฉ๋‹ˆ๋‹ค.

๋„ค์ด๋ฐ

ํด๋ž˜์Šค

  • ํด๋ž˜์Šค ์ด๋ฆ„์—๋Š” UpperCamelCase๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ํด๋ž˜์Šค ์ด๋ฆ„์—๋Š” ์ ‘๋‘์‚ฌ๋ฅผ ๋ถ™์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ•จ์ˆ˜

  • ํ•จ์ˆ˜ ์ด๋ฆ„์—๋Š” lowerCamelCase๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ํ•จ์ˆ˜ ์ด๋ฆ„ ์•ž์—๋Š” ๋˜๋„๋ก์ด๋ฉดย get์„ ๋ถ™์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    • ์ข‹์€ ์˜ˆ:

      func name(for user: User) -> String?
    • ๋‚˜์œ ์˜ˆ:

      func getName(for user: User) -> String?
  • Action ํ•จ์ˆ˜์˜ ๋„ค์ด๋ฐ์€ '์ฃผ์–ด + ๋™์‚ฌ + ๋ชฉ์ ์–ด' ํ˜•ํƒœ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    • Tap(๋ˆŒ๋ €๋‹ค ๋—Œ)*์€ย UIControlEvents์˜ย .touchUpInside์— ๋Œ€์‘ํ•˜๊ณ , *Press(๋ˆ„๋ฆ„)*๋Š”ย .touchDown์— ๋Œ€์‘ํ•ฉ๋‹ˆ๋‹ค.
    • will~์€ ํŠน์ • ํ–‰์œ„๊ฐ€ ์ผ์–ด๋‚˜๊ธฐ ์ง์ „์ด๊ณ ,ย did~๋Š” ํŠน์ • ํ–‰์œ„๊ฐ€ ์ผ์–ด๋‚œ ์งํ›„์ž…๋‹ˆ๋‹ค.
    • should~๋Š” ์ผ๋ฐ˜์ ์œผ๋กœย Bool์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์— ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

    ์ข‹์€ ์˜ˆ:

    func backButtonDidTap() {
      // ...
    }

    ๋‚˜์œ ์˜ˆ:

    func back() {
      // ...
    }
    
    func pressBack() {
      // ...
    }

๋ณ€์ˆ˜

  • ๋ณ€์ˆ˜ ์ด๋ฆ„์—๋Š” lowerCamelCase๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์ƒ์ˆ˜

  • ์ƒ์ˆ˜ ์ด๋ฆ„์—๋Š” 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?

ํด๋กœ์ €

  • ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋ฆฌํ„ด ํƒ€์ž…์ด ์—†๋Š” Closure ์ •์˜์‹œ์—๋Š”ย () -> Void๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    let completionBlock: (() -> Void)?
  • Closure ์ •์˜์‹œ ํŒŒ๋ผ๋ฏธํ„ฐ์—๋Š” ๊ด„ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    { operation, responseObject in
      // doSomething()
    }
  • Closure ์ธ์ž ์ž‘์„ฑ ์‹œ, ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ํƒ€์ž… ์ •์˜๋ฅผ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค.

    ...,
    completion: { finished in
      // doSomething()
    }
  • Closure ํ˜ธ์ถœ์‹œ ๋˜ ๋‹ค๋ฅธ ์œ ์ผํ•œ Closure๋ฅผ ๋งˆ์ง€๋ง‰ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›๋Š” ๊ฒฝ์šฐ(ํ›„ํ–‰ ํด๋กœ์ €), ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์„ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค. ์ข‹์€ ์˜ˆ:

    UIView.animate(withDuration: 0.5) {
      // doSomething()
    }

    ๋‹จ, ํŒŒ๋ผ๋ฏธํ„ฐ์— ํ›„ํ–‰ ํด๋กœ์ €๊ฐ€ 2๊ฐœ ์ด์ƒ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์•„๋ž˜ ๋‘ ๊ฐ€์ง€ ์กฐ๊ฑด์„ ์ค€์ˆ˜ํ•ฉ๋‹ˆ๋‹ค.

    • ๋ชจ๋“  ํด๋กœ์ €๋Š” ์ถ•์•ฝ ํ‘œํ˜„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ๋‘๋ฒˆ์งธ ํด๋กœ์ €๋ถ€ํ„ฐ๋Š” ์•ž์— ์žˆ๋Š” ํด๋กœ์ €์˜ ๋} ์—์„œ ์ค„๋ฐ”๊ฟˆ์„ ํ•˜์ง€ ์•Š๊ณ  ๋ผ๋ฒจ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
    // UIView.animate(withDuration: TimeInterval, animations: () -> Void, completion: ((Bool) -> Void)?)
    UIView.animate(withDuration: 0.25) {
        // doSomething() about animations
      } completion: { finished in
        // doSomething() 
      }
    
    // SwiftUI Button
    Button {
    
    } label: {
    
    }

ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด

  • ํด๋ž˜์Šค์™€ ๊ตฌ์กฐ์ฒด ๋‚ด๋ถ€์—์„œ๋Š”ย self๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚ด์žฅ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด, ๋ถˆํ•„์š”ํ•œ ์ดˆ๊ธฐํ™” ํ•จ์ˆ˜๋ฅผ ์žฌ๊ตฌ์„ฑ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
let frame = CGRect(x: 0, y: 0, width: 100, height: 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>?
  • Int, Float, String, Bool ํƒ€์ž…์€ ๋ณ€์ˆ˜/์ƒ์ˆ˜ ์„ ์–ธ ์‹œ, ๋ช…์‹œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    var isShowAnyView = false
    var referenceCount = 0

์ฃผ์„

  • ํ•œ์ค„ ์ฃผ์„

    ํ•œ์ค„ ์ฃผ์„์—๋Š”//๋งŒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์—ฌ๋Ÿฌ์ค„ ์ฃผ์„

    ๋‘ ์ค„ ์ด์ƒ์˜ ์ฃผ์„์„ ์ž‘์„ฑํ• ๋•Œ๋Š” /* */ ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์ฃผ์„์˜ ๋“ค์—ฌ์“ฐ๊ธฐ๋Š” ์ฃผ์„๊ณผ ๊ด€๋ จ๋œ ์ฝ”๋“œ์™€ ์ผ์น˜ ์‹œํ‚ต๋‹ˆ๋‹ค.

    ๋‹จ, ์—ฌ๋Ÿฌ์ค„ ์ฃผ์„์˜ ๊ฒฝ์šฐ ์ฃผ์„ ๊ธฐํ˜ธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ 2๊ฐœ์˜ space๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

    // ํ•œ์ค„ ์ฃผ์„
    
    /*
    	์ฃผ์„์ด
    	๋‘๊ฐœ์ง€์š”.
    */
  • ///๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๋ฌธ์„œํ™”์— ์‚ฌ์šฉ๋˜๋Š” ์ฃผ์„์„ ๋‚จ๊น๋‹ˆ๋‹ค.

    • ๋ฌธ์„œํ™”์— ์‚ฌ์šฉ๋˜๋Š” ์ฃผ์„์ด๋ž€, option key๋ฅผ ๋ˆ„๋ฅธ ์ฑ„๋กœ ํ•ด๋‹น ํ•จ์ˆ˜ ๋˜๋Š” ํ”„๋กœํผํ‹ฐ๋ฅผ ํด๋ฆญํ–ˆ์„ ๋•Œ ๋ณผ ์ˆ˜ ์žˆ๋Š” Summary์˜ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค.
    /// ์‚ฌ์šฉ์ž ํ”„๋กœํ•„์„ ๊ทธ๋ ค์ฃผ๋Š” ๋ทฐ
    class ProfileView: UIView {
    
      /// ์‚ฌ์šฉ์ž ๋‹‰๋„ค์ž„์„ ๊ทธ๋ ค์ฃผ๋Š” ๋ผ๋ฒจ
      var nameLabel: UILabel!
    }

MARK

  • // 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()
    }
  • Mark Label

    • SwiftUI View
    // MARK: State ProPerties
    -> property Wrapper๊ฐ€ ์žˆ๋Š” let, var
    -> ์ˆœ์„œ: AppStorage, Environment, EnvironmentObject, State, Binding, ObservedObject, StateObject
    -> ์ˆœ์„œ์— ๋ช…์‹œ๋˜์ง€ ์•Š์€ Wrapper๋Š” ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰์— ์˜ค๋ฆ„์ฐจ์ˆœ์œผ๋กœ ์ž‘์„ฑ
    
    // MARK: General ProPerties
    -> property Wrapper๊ฐ€ ์—†๋Š” let, var
    
    // MARK: Methods
    
    // MARK: ViewBuilder
    -> @ViewBuilder๊ฐ€ wrapping๋œ ๋ชจ๋“  ๊ฒƒ
    -> ๋‹จ, ProPerties, Methods ์ˆœ์„œ๋กœ ์ž‘์„ฑ
    
    // MARK: Life Cycles
    -> init, body
    • OberverableObject Class
    // MARK: State ProPerties
    // SwiftUI View์™€ ๋™์ผ
    
    // MARK: Published ProPerties
    -> @Published let, var
    
    // MARK: General ProPerties
    
    // MARK: Methods
    
    // MARK: Life Cycles
    • UIViewController
    // UIViewController
    // MARK: - ProPerties
    
    // MARK: - Methods
    
    // MARK: - IBOutlets
    
    // MARK: - IBActions
    
    // MARK: - Delegates And DataSources
    
    // MARK: - Life Cycles

ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ถŒ์žฅ์‚ฌํ•ญ

  • ์ƒ์ˆ˜๋ฅผ ์ •์˜ํ•  ๋•Œ์—๋Š”ย enum๋ฅผ ๋งŒ๋“ค์–ด ๋น„์Šทํ•œ ์ƒ์ˆ˜๋ผ๋ฆฌ ๋ชจ์•„๋‘ก๋‹ˆ๋‹ค. ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜ ์ธก๋ฉด์—์„œ ํฐ ํ–ฅ์ƒ์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.ย structย ๋Œ€์‹ ย enum์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š”, ์ƒ์„ฑ์ž๊ฐ€ ์ œ๊ณต๋˜์ง€ ์•Š๋Š” ์ž๋ฃŒํ˜•์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ์ž…๋‹ˆ๋‹ค.

  • ๋”์ด์ƒ ์ƒ์†์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š๋Š” ํด๋ž˜์Šค๋Š” ํ•ญ์ƒย finalย ํ‚ค์›Œ๋“œ๋กœ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.

  • ํ”„๋กœํ† ์ฝœ์„ ์ ์šฉํ•  ๋•Œ์—๋Š” extension์„ ๋งŒ๋“ค์–ด์„œ ๊ด€๋ จ๋œ ๋ฉ”์„œ๋“œ๋ฅผ ๋ชจ์•„๋‘ก๋‹ˆ๋‹ค.

    **์ข‹์€ ์˜ˆ**:
    
    final class MyViewController: UIViewController {
      // ...
    }
    
    // MARK: UITableViewDataSource
    
    extension MyViewController: UITableViewDataSource {
      // ...
    }
    
    // MARK: UITableViewDelegate
    
    extension MyViewController: UITableViewDelegate {
      // ...
    }
    
    **๋‚˜์œ ์˜ˆ**:
    final class MyViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
      // ...
    }

Reference

[GitHub - StyleShare/swift-style-guide: StyleShare์—์„œ ์ž‘์„ฑํ•œ Swift ํ•œ๊ตญ์–ด ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ]

[GitHub - DeveloperAcademy-POSTECH/swift-style-guide: ์•„์นด๋ฐ๋ฏธ์—์„œ ์‚ฌ์šฉ ํ•˜๋Š” ์ฝ”๋”ฉ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ ์ž…๋‹ˆ๋‹ค.]

Clone this wiki locally