Skip to content

HEROHJK/SwiftStyleGuide

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

10 Commits
Β 
Β 
Β 
Β 

Repository files navigation

Swift Style Guide

github StyleShare κ°€μ΄λ“œλ₯Ό κΈ°μ€€μœΌλ‘œ μž‘μ„± 됨.

μ΅œμ’… μˆ˜μ •μΌ : 2022-05-18

λͺ©μ°¨

StyleGuide용 라이브러리

    • μ»¨λ²€μ…˜ κ°•μ œ 도ꡬ
    • μ΄λ‹ˆμ…œλΌμ΄μ§• κ°œμ„ μš© μ½”λ”© μŠ€νƒ€μΌ κ°œμ„  라이브러리

Style Guide

μ½”λ“œ λ ˆμ΄μ•„μ›ƒ

μ΅œλŒ€ 쀄 길이

  • ν•œμ€„μ€ 100자λ₯Ό λ„˜μ§€ μ•Šλ„λ‘ 함.
    • μ›λž˜ 120μžμ˜€λŠ”λ°.. μ†Œν˜• λͺ¨λ‹ˆν„°μ—μ„œ μ™Όμͺ½ λΈŒλΌμš°μ €λ₯Ό μ—° μƒν™©μ—μ„œ 120μžκΉŒμ§€ ν‘œμ‹œλ˜μ§€ μ•ŠμŒ.
    • Xcode의 Preferences -> Text Editing -> Display의 Page guide at column μ—μ„œ 100으둜 μ„€μ •.

λ“€μ—¬μ“°κΈ° 및 띄어쓰기

  • 콜둠(:)을 μ“Έ λ•Œμ—λŠ” 콜둠의 였λ₯Έμͺ½μ• λ§Œ 곡백을 λ‘ .
  • 단, μ‚Όν•­ μ—°μ‚°μžμ˜ 경우 μ•žλ’€λ‘œ 띄움.
    let name: String
    let result = one > other ? true : false
  • μ—°μ‚°μž μ˜€λ²„λ‘œλ”© ν•¨μˆ˜ μ •μ˜μ—μ„œλŠ” μ—°μ‚°μžμ™€ κ΄„ν˜Έ 사이에 ν•œμΉΈμ˜ 곡백 ν•„μš”.
    func ** (one: Int, other: Int)

쀄 λ°”κΏˆ

  • ν•¨μˆ˜μ˜ μ •μ˜κ°€ μ΅œλŒ€ 길이λ₯Ό μ΄ˆκ³Όν•˜λŠ” 경우, νŒŒλΌλ―Έν„°λ₯Ό κΈ°μ€€μœΌλ‘œ 쀄 λ°”κΏˆ.
    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: "μ‚­μ œν•΄μ£Όμ„Έμš”"
    )
  • νŒŒλΌλ―Έν„°μ— ν΄λ‘œμ €κ°€ 2개 이상 μ‘΄μž¬ν•˜λŠ” κ²½μš°μ—λŠ” 무쑰건 λ‚΄λ €μ“°κΈ°.
    UIView.animate(
      withDuration: 0.25,
      animations: {
        // doSomething()
      },
      completion: { finished in
        // doSomething()
      }
    )

빈 쀄

  • 빈 μ€„μ—λŠ” 곡백이 ν¬ν•¨λ˜μ§€ μ•Šλ„λ‘ 함.
  • λͺ¨λ“  νŒŒμΌμ€ 빈 μ€„λ‘œ λλ‚˜λ„λ‘ 함.
  • MARK ꡬ문의 μœ„μ™€ μ•„λž˜μ—λŠ” 곡백이 ν•„μš”.
// MARK: Layout

override func layoutSubviews() {
  // doSomething()
}

// MARK: Actions

override func menuButtonDidTap() {
  // doSomething()
}

넀이밍

클래슀 / ꡬ쑰체

  • μ•½μ–΄λŠ” λ„€μ΄λ°μ˜ κ°€μž₯ 첫번째λ₯Ό μ œμ™Έν•˜κ³ λŠ”, λŒ€λ¬Έμžλ‘œ 처리
    • λ³€μˆ˜λͺ…이 id같은 κ²½μš°μ—λ§Œ μ†Œλ¬Έμžλ‘œ 처리
  • μ΄λ¦„μ—λŠ” UpperCamelCaseλ₯Ό μ‚¬μš©.
    • μ•½μ–΄λŠ” μ˜ˆμ™Έλ‘œ, λŒ€λ¬Έμž 처리
  • 클래슀 이름에 접두사λ₯Ό 뢙이지 μ•ŠμŒ.
    • νŒŒμƒν˜•μ˜ μ•žμžλ¦¬λ“±μ˜ 접두사λ₯Ό 뢙이지 μ•ŠμŒ.
/// 쒋은 예
class ViewController: ActionViewController { }
/// λ‚˜μœ 예
class AViewController: ActionViewController { }

/// 쒋은 예
let userID
let id
user.secondID = "test2"
/// λ‚˜μœ 예
let userId
let iD
user.secondId = "test2"
user.secondid = "test2"

ν•¨μˆ˜

  • ν•¨μˆ˜ μ΄λ¦„μ—λŠ” lowerCamelCaseλ₯Ό μ‚¬μš©.
  • ν•¨μˆ˜μ΄λ¦„μ—λŠ” λ˜λ„λ‘μ΄λ©΄ get, set같은 λͺ…칭을 μ“°μ§€ μ•ŠμœΌλ©°, 클래슀 λ©”μ†Œλ“œμΈ 경우 이름이 μ€‘λ³΅λ˜μ§€ μ•Šλ„λ‘ 처리.
  • λ§€κ°œλ³€μˆ˜ λ˜ν•œ λ˜λ„λ‘ κ°„λ‹¨ν•œ 접두사λ₯Ό μ΄μš©ν•˜μ—¬ 처리.
/// 쒋은 예
func name(for user: User) -> String?
func grade(from: Subject) -> User?
/// λ‚˜μœ 예
func getName(user: User) -> String?
func getGradeFromSubject(subject: Subject) -> User?

μ—΄κ±°ν˜•

  • enum의 각 caseμ—λŠ” lowerCamelCaseλ₯Ό μ‚¬μš©.
/// 쒋은 예
enum Result {
    case success
    case failure
}

/// λ‚˜μœ 예
enum Result {
    case Success
    case Failure
}

μ•½μ–΄

  • μ•½μ–΄μ˜ 경우, μ‹œμž‘μ€ λ˜‘κ°™μ΄ μ†Œλ¬Έμžλ‘œ ν‘œκΈ°ν•˜λ‚˜, μ‹œμž‘μ΄ μ•„λ‹Œ 경우 무쑰건 λŒ€λ¬Έμžλ‘œ ν‘œκΈ°.
/// 쒋은 예
    let userID: String
    let html: String
    let websiteURL: URL
    let urlString: String
/// λ‚˜μœ 예
    let userId: String
    let HTML: String
    let websideUrl: URL
    let URLString: String

ν΄λ‘œμ €

  • νŒŒλΌλ―Έν„°μ™€ λ¦¬ν„΄νƒ€μž…μ΄ μ—†λŠ” Closure μ •μ˜ μ‹œ, () -> Voidλ₯Ό 이용.
  • Closure μ •μ˜ μ‹œ νŒŒλΌλ―Έν„°μ—λŠ” κ΄„ν˜Έλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμŒ.
  • Closure μ •μ˜ μ‹œ κ°€λŠ₯ν•œ 경우 νƒ€μž… μ •μ˜ μƒλž΅, μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” νŒŒλΌλ―Έν„° λ˜ν•œ _ 둜 ν‘œκΈ°
  • 호좜 μ‹œ λ§ˆμ§€λ§‰ νŒŒλΌλ―Έν„°κ°€ Closure인 경우 νŒŒλΌλ―Έν„° 이름 μƒλž΅.
/// () -> Void의 예
/// 쒋은 예
let completion: (() -> Void)?
/// λ‚˜μœ 예
let completion: (() -> ())?
let completion: ((Void) -> (Void))?

/// κ΄„ν˜Έ κ΄€λ ¨ 예
/// 쒋은 예
{ operation, response in

}
/// λ‚˜μœ 예
{ (operation, response) in

}

/// νƒ€μž… μ •μ˜ κ΄€λ ¨ 예
/// 쒋은 예
{ _, result -> Void in
    print(result)
}
/// λ‚˜μœ 예
{ (statusCode: Int, result: JSON) -> Void in
    print(result)
}

/// λ§ˆμ§€λ§‰ νŒŒλΌλ―Έν„°
/// 쒋은 예
UIView.animate(withDuration: 0.5) {
    // doSomething
}
/// λ‚˜μœ 예
UIView.animate(withDuration: 0.5, animations: { () -> Void in
    // doSomething
})

클래슀 / ꡬ쑰체

  • ν΄λž˜μŠ€μ™€ ꡬ쑰체 λ‚΄λΆ€μ—μ„œλŠ” selfλ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ‚¬μš©.
  • ꡬ쑰체λ₯Ό 생성할 λ•Œμ—λŠ” Swift ꡬ쑰체 μƒμ„±μžλ₯Ό μ‚¬μš©.
    • build, make같은 λ©”μ„œλ“œ μ‚¬μš© μ§€μ–‘

νƒ€μž…

  • Array<T>, Dictionary<T: U> λ³΄λ‹€λŠ” [T], [T: U]λ₯Ό μ‚¬μš©.

주석

  • ///λ₯Ό μ‚¬μš©ν•˜μ—¬ λ¬Έμ„œν™”μ— μ‚¬μš©λ˜λŠ” 주석 남김.
  • // MARK:λ₯Ό μ‚¬μš©ν•˜μ—¬ μ—°κ΄€ μ½”λ“œ ꡬ뢄.

ν”„λ‘œκ·Έλž˜λ° ꢌμž₯사항

  • κ°€λŠ₯ν•˜λ‹€λ©΄ λ³€μˆ˜λ₯Ό μ •μ˜ν•  λ•Œ ν•¨κ»˜ μ΄ˆκΈ°ν™”. μ΄λ•Œ Then을 이용.
/// 쒋은 예
let label = UILabel().then {
    $0.textAlignment = .center
    $0.textColor = .black
    $0.text = "Hello, World"
}
/// λ‚˜μœ 예
let label = UILabel()
label.textAlignment = .center
label.textColor = .black
label.text = "Hell World"
  • extension은 λ˜λ„λ‘ 뢄리.
/// 쒋은 예
class ViewController: UIViewController {
    // ...
}

// MARK: - ν…Œμ΄λΈ”λ·° Extension

extension ViewController: UITableViewDataSource {
    // ...
}

extension ViewController: UITableViewDelegate {
    // ...
}

// MARK: - μ½œλ ‰μ…˜λ·° Extension

extension ViewController: UICollectionViewDataSource {
    // ...
}

extension ViewController: UICollectionViewDelegate {
    // ...
}
/// λ‚˜μœ 예

class ViewController: UIViewController, UITableViewDataSource, UITableViewDataSource, UICollectionViewDataSource, UICollectionViewDelegate {
    // ...
}

SwiftLint μ‚¬μš© κ°€μ΄λ“œ

  • SwiftLintλ₯Ό λ¨Όμ € μ„€μΉ˜
  • xcode ν”„λ‘œμ νŠΈ μŠ€ν¬λ¦½νŠΈμ—μ„œ, μ•„λž˜ 슀크립트λ₯Ό μΆ”κ°€.
if which swiftlint >/dev/null; then
  swiftlint
else
  echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi
  • M1의 경우
if test -d "/opt/homebrew/bin/"; then
  PATH="/opt/homebrew/bin/:${PATH}"
fi

export PATH

if which swiftlint >/dev/null; then
  swiftlint
else
  echo "warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint"
fi
  • ν”„λ‘œμ νŠΈμ— .swiftlint.yml νŒŒμΌμ„ λ§Œλ“  ν›„, μ•„λž˜ μ½”λ“œ μΆ”κ°€
  • parent_config: https://raw.githubusercontent.com/HEROHJK/SwiftStyleGuide/master/lint.yml

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors