Skip to content

SOPKATHON-iOS-TEAM3/Sopkathon-iOS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

1. μ„œλΉ„μŠ€ 이름 및 κ°„λ‹¨ν•œ μ†Œκ°œ πŸ“±

TO.0, Too

  • 의미: Too = ν•¨κ»˜λΌλŠ” 의미, λͺ¨λ₯΄λŠ” μ‚¬λžŒμ˜ 정보가 0이 λ˜λ„λ‘ λ•κ² λ‹€λŠ” 의미
  • 간단 μ†Œκ°œ: μ„œλ‘œμ— λŒ€ν•œ 사전 정보λ₯Ό ν€΄μ¦ˆλΌλŠ” κ²Œμž„μ‹ ν˜•νƒœλ‘œ, 미리 μ œκ³΅ν•¨μœΌλ‘œμ¨ 첫 λŒ€ν™”λ₯Ό μˆ˜μ›”ν•˜κ²Œ 도와쀀닀.

2. μ£Όμš” κΈ°λŠ₯ πŸ› οΈ

  • μΉœν•΄μ Έμ•Ό ν•˜λŠ” μ‚¬λžŒμ˜ 숫자, μ‹œκ°μ μœΌλ‘œ 제곡
  • 본인의 정보에 λŒ€ν•œ ν€΄μ¦ˆ μ œμž‘
  • ν€΄μ¦ˆ 제곡자의 ν€΄μ¦ˆ ν’€κΈ°

3. νŒ€μ› μ—­ν•  λΆ„λ‹΄ ❀️‍πŸ”₯

이λͺ…진
(@thingineeer)
박읡범
(@parkikbum)
μ„œμ€μˆ˜
(@EunsuSeo01)
κΉ€λ―Όμ„œ
(@kms0233)
ν™ˆ ν™”λ©΄ 및 μ΄ˆλŒ€ μ½”λ“œ λ·° κ΅¬ν˜„ ν€΄μ¦ˆ 생성 및 링크 생성 λ·° κ΅¬ν˜„ ν€΄μ¦ˆ ν’€κΈ° 및 κ²°κ³Ό λ·° κ΅¬ν˜„ μŠ€ν”Œλž˜μ‹œ 및 μ˜¨λ³΄λ”© λ·° κ΅¬ν˜„

4. μ»¨λ²€μ…˜ κ·œμΉ™κ³Ό 브랜치 μ „λž΅

Commit Message Rule

[Prefix] #IssueNumber - Description

[Prefix]

[Feat] : μƒˆλ‘œμš΄ κΈ°λŠ₯ κ΅¬ν˜„
[Add] : λΆ€μˆ˜μ μΈ μ½”λ“œ μΆ”κ°€ 및 라이브러리 μΆ”κ°€, μƒˆλ‘œμš΄ 파일 생성
[Chore] : 버전 μ½”λ“œ μˆ˜μ •, νŒ¨ν‚€μ§€ ꡬ쑰 λ³€κ²½, νƒ€μž… 및 λ³€μˆ˜λͺ… λ³€κ²½ λ“±μ˜ μž‘μ€ μž‘μ—…, 파일 이름 λ³€κ²½
[Del] : μ“Έλͺ¨μ—†λŠ” μ½”λ“œλ‚˜ 파일 μ‚­μ œ
[Design] : UI μž‘μ—…
[Fix] : 버그 및 였λ₯˜ ν•΄κ²°
[Refactor] : μ „λ©΄ μˆ˜μ •
[Docs] : READMEλ‚˜ WIKI λ“±μ˜ λ¬Έμ„œ κ°œμ •
[Setting] : ν”„λ‘œμ νŠΈ μ„ΈνŒ…
[Comment] : 주석 μΆ”κ°€, μ‚­μ œ (Only 주석)
  • ex) [Feat] #5 - μ„œλ²„ μ—°κ²° κ΅¬ν˜„

Issue Naming Rule

[Prefix] - Description

  • ex) [Feat] - ν€΄μ¦ˆ λ·° κ΅¬ν˜„

Code Review Rule

μ½”λ“œ 리뷰λ₯Ό μ΅œλŒ€ν•œ 빨리 달고 λ°˜μ˜ν•˜μž! (λ‘₯κΈ€λ‘₯κΈ€ 말투둜 ν•΄κ²°ν•˜κΈ°)

  • ex) 이거 μ™œ μ΄λ ‡κ²Œ μ§°μ–΄μš”? (X) ν•΄λ‹Ή κΈ°λŠ₯을 κ΅¬ν˜„ν•œ μ΄μœ κ°€ κΆκΈˆν•©λ‹ˆλ‹€ ‼️ (O)

Branch Naming Rule

[Prefix]/#issuenumber

  • ex) [Feat]/#1

Git Flow

  1. 이슈 생성
  2. 브랜치 생성
  3. 브랜치 add, commit, push β†’ PR κ³Όμ • 거치기
  4. μ΅œμ†Œ 1λͺ… "Approve" μžˆμ–΄μ•Ό merge (κ°•μ œ 머지 κΈˆμ§€ ν•˜λ©΄ μ†νŠΈ 제λͺ… bypass)
  5. 머지 ν›„ ( ν•΄λ‹Ή 브랜치 λ°”λ‘œ 제거 )
  6. pull λ°›μ•„μ„œ λ‹€μŒ 이슈 진행

⭐️ Coding Convention

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

  • λ“€μ—¬μ“°κΈ°μ—λŠ” νƒ­(tab)

  • 콜둠(:)을 μ“Έ λ•Œμ—λŠ” 콜둠의 였λ₯Έμͺ½μ—λ§Œ 곡백을 λ‘‘λ‹ˆλ‹€.

    let names: [String: String]?
    

μ€„λ°”κΏˆ

  • ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” μ½”λ“œκ°€ μ΅œλŒ€ 길이λ₯Ό μ΄ˆκ³Όν•˜λŠ” κ²½μš°μ—λŠ” νŒŒλΌλ―Έν„° 이름을 κΈ°μ€€μœΌλ‘œ μ€„λ°”κΏˆν•©λ‹ˆλ‹€. (control + M)

    let actionSheet = UIActionSheet(
      title: "정말 계정을 μ‚­μ œν•˜μ‹€ κ±΄κ°€μš”?",
      delegate: self,
      cancelButtonTitle: "μ·¨μ†Œ",
      destructiveButtonTitle: "μ‚­μ œν•΄μ£Όμ„Έμš”"
    )
    

    ν•¨μˆ˜ νŒŒλΌλ―Έν„°κ°€ 3개 이상인 κ²½μš°λ„ 이름을 κΈ°μ€€μœΌλ‘œ μ€„λ°”κΏˆ ν•©λ‹ˆλ‹€.

  • 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
    }
    

빈 쀄

  • MARK ꡬ문 μœ„μ™€ μ•„λž˜μ—λŠ” 곡백이 ν•„μš”ν•©λ‹ˆλ‹€.

    // MARK: Layout
    
    override func layoutSubviews() {
      // doSomething()
    }
    
    // MARK: Actions
    
    override func menuButtonDidTap() {
      // doSomething()
    }
    

μž„ν¬νŠΈ

λͺ¨λ“ˆ μž„ν¬νŠΈλŠ” μ•ŒνŒŒλ²³ 순으둜 μ •λ ¬ν•©λ‹ˆλ‹€. λ‚΄μž₯ ν”„λ ˆμž„μ›Œν¬λ₯Ό λ¨Όμ € μž„ν¬νŠΈν•˜κ³ , 빈 μ€„λ‘œ κ΅¬λΆ„ν•˜μ—¬ μ„œλ“œνŒŒν‹° ν”„λ ˆμž„μ›Œν¬λ₯Ό μž„ν¬νŠΈν•©λ‹ˆλ‹€.

importλŠ” μ΅œμ†Œν™”ν•œλ‹€. - ex. UIKit은 Foundation을 ν¬ν•¨ν•˜κ³  있음

then 으둜 톡일 ^^^^

import UIKit

import SnapKit
import Then

넀이밍

ν΄λž˜μŠ€μ™€ ꡬ쑰체

  • ν΄λž˜μŠ€μ™€ ꡬ쑰체의 μ΄λ¦„μ—λŠ” UpperCamelCaseλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

  • 클래슀 μ΄λ¦„μ—λŠ” 접두사Prefixλ₯Ό 뢙이지 μ•ŠμŠ΅λ‹ˆλ‹€.

    쒋은 예:

    class SomeClass {
      // class definition goes here
    }
    
    struct SomeStructure {
      // structure definition goes here
    }

    λ‚˜μœ 예:

    class someClass {
    // class definition goes here
    }
    
    struct someStructure {
    // structure definition goes here
    }

ν•¨μˆ˜

  • ν•¨μˆ˜ μ΄λ¦„μ—λŠ” lowerCamelCaseλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

  • ν•¨μˆ˜ 이름 μ•žμ—λŠ” λ˜λ„λ‘μ΄λ©΄Β get을 뢙이지 μ•ŠμŠ΅λ‹ˆλ‹€.

  • λ§€κ°œλ³€μˆ˜ λͺ…은 ν•¨μˆ˜λͺ…κ³Ό μ΄μ–΄μ Έμ„œ μ΄ν•΄ν•˜κΈ° νŽΈν•˜κ²Œ

    쒋은 예:

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

    λ‚˜μœ 예:

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

λ³€μˆ˜

  • λ³€μˆ˜ μ΄λ¦„μ—λŠ” lowerCamelCaseλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

μƒμˆ˜

  • μƒμˆ˜ 이름에도 lowerCamelCaseλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

    쒋은 예:

    let maximumNumberOfLines = 3
    

    λ‚˜μœ 예:

    let MaximumNumberOfLines = 3
    let MAX_LINES = 3
    

μ—΄κ±°ν˜•

  • enum의 μ΄λ¦„μ—λŠ” UpperCamelCaseλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

  • enum의 각 caseμ—λŠ” lowerCamelCaseλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

    쒋은 예:

    enum Result {
      case .success
      case .failure
    }
    

    λ‚˜μœ 예:

    enum Result {
      case .Success
      case .Failure
    }
    
    enum result {
      case .Success
      case .Failure
    }
    

ν”„λ‘œν† μ½œ

  • ν”„λ‘œν† μ½œμ˜ μ΄λ¦„μ—λŠ” UpperCamelCaseλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

  • κ΅¬μ‘°μ²΄λ‚˜ ν΄λž˜μŠ€μ—μ„œ ν”„λ‘œν† μ½œμ„ 채택할 λ•ŒλŠ” 콜둠과 λΉˆμΉΈμ„ λ„£μ–΄ κ΅¬λΆ„ν•˜μ—¬ λͺ…μ‹œν•©λ‹ˆλ‹€.

  • extension을 톡해 채택할 λ•Œλ„ λ™μΌν•˜κ²Œ μ μš©λ©λ‹ˆλ‹€.

  • μ΅œλŒ€ν•œ μš”κ΅¬μ‚¬ν•­μ΄ μžˆλŠ” ν”„λ‘œν† μ½œμ„ 채택할 λ•ŒλŠ” extensionμ—μ„œ μ±„νƒν•˜κ³  κ΅¬ν˜„ν•©μ‹œλ‹€!

    쒋은 예:

    protocol SomeProtocol {
      // protocol definition goes here
    }
    
    struct SomeStructure: SomeProtocol, AnotherProtocol {
      // structure definition goes here
    }
    
    class SomeClass: SomeSuperclass, SomeProtocol, AnotherProtocol {
        // class definition goes here
    }
    
    extension UIViewController: SomeProtocol, AnotherProtocol {
      // doSomething()
    }

μ•½μ–΄

  • μ•½μ–΄λ‘œ μ‹œμž‘ν•˜λŠ” 경우 μ†Œλ¬Έμžλ‘œ ν‘œκΈ°ν•˜κ³ , κ·Έ μ™Έμ˜ κ²½μš°μ—λŠ” 항상 λŒ€λ¬Έμžλ‘œ ν‘œκΈ°ν•©λ‹ˆλ‹€.

    쒋은 예:

      let userID: Int?
      let html: String?
      let websiteURL: URL? URL(url: "asdasdasdasd")
      let urlString: String?

    λ‚˜μœ 예:

      let userId: Int?
      let HTML: String?
      let websiteUrl: NSURL?
      let URLString: String?

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)
    }

ν΄λ‘œμ €

  • νŒŒλΌλ―Έν„°μ™€ 리턴 νƒ€μž…μ΄ μ—†λŠ” Closure μ •μ˜μ‹œμ—λŠ”Β () -> Voidλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

    쒋은 예:

    let completionBlock: (**() -> Void**)?

    λ‚˜μœ 예:

    let completionBlock: (() -> ())?
    let completionBlock: ((Void) -> (Void))?
  • Closure ν˜ΈμΆœμ‹œ λ˜λ‹€λ₯Έ μœ μΌν•œ Closureλ₯Ό λ§ˆμ§€λ§‰ νŒŒλΌλ―Έν„°λ‘œ λ°›λŠ” 경우, νŒŒλΌλ―Έν„° 이름을 μƒλž΅ν•©λ‹ˆλ‹€. (ν΄λ‘œμ €κ°€ ν•˜λ‚˜μΈ κ²½μš°μ—λ§Œ! 두 개 이상인 경우 μƒλž΅ν•˜μ§€ 말고 νŒŒλΌλ―Έν„° 이름을 λͺ…μ‹œν•΄ 쀄 것.)

    쒋은 예:

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

    λ‚˜μœ 예:

    UIView.animate(withDuration: 0.5, animations: { () -> Void in
      // doSomething()
    })

ν΄λž˜μŠ€μ™€ ꡬ쑰체

  • ꡬ쑰체λ₯Ό 생성할 λ•Œμ—λŠ” Swift ꡬ쑰체 μƒμ„±μžλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€.

    쒋은 예:

    let frame = CGRect(x: 0, y: 0, width: 100, height: 100)

    λ‚˜μœ 예:

    let frame = CGRectMake(0, 0, 100, 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>?

주석

  • ///λ₯Ό μ‚¬μš©ν•΄μ„œ λ¬Έμ„œν™”μ— μ‚¬μš©λ˜λŠ” 주석을 λ‚¨κΉλ‹ˆλ‹€.

    /// μ‚¬μš©μž ν”„λ‘œν•„μ„ κ·Έλ €μ£ΌλŠ” λ·°
    class ProfileView: UIView {
    
      /// μ‚¬μš©μž λ‹‰λ„€μž„μ„ κ·Έλ €μ£ΌλŠ” 라벨
      var nameLabel: UILabel!
    }
    
  • // MARK:λ₯Ό μ‚¬μš©ν•΄μ„œ μ—°κ΄€λœ μ½”λ“œλ₯Ό κ΅¬λΆ„μ§“μŠ΅λ‹ˆλ‹€.

    Objective-Cμ—μ„œ μ œκ³΅ν•˜λŠ”Β #pragma mark와 같은 κΈ°λŠ₯으둜, μ—°κ΄€λœ μ½”λ“œμ™€ 그렇지 μ•Šμ€ μ½”λ“œλ₯Ό ꡬ뢄할 λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€.


5. 폴더링 πŸ“

β”œβ”€β”€ Application
β”‚Β Β  β”œβ”€β”€ AppDelegate.swift
β”‚Β Β  β”œβ”€β”€ Base.lproj
β”‚Β Β  β”œβ”€β”€ Info.plist
β”‚Β Β  └── SceneDelegate.swift
β”œβ”€β”€ Data
β”‚Β Β  └── Dto.swift
β”œβ”€β”€ Global
β”‚Β Β  β”œβ”€β”€ Extension
β”‚Β Β  β”œβ”€β”€ Literals
β”‚Β Β  └── Resource
β”œβ”€β”€ Network
β”‚Β Β  β”œβ”€β”€ Base
β”‚Β Β  └── Network.swift
└── Presentation
    β”œβ”€β”€ TabBar
    β”œβ”€β”€ ViewControllers
    └── Views

6. μ‹œμ—° μ˜μƒ πŸŽ₯

Simulator Screen Recording - iPhone 13 Pro - 2024-05-19 at 08 29 11

7. μ•„μš” νŒ€μ›λ“€μ˜ 사진 πŸ“Έ

Before 😎

KakaoTalk_Photo_2024-05-18-22-06-46 KakaoTalk_Photo_2024-05-18-22-06-51

After 🀀

image

About

μ•„μš” λ ˆλ””~🫢

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •  

Languages