- μλ―Έ: Too = ν¨κ»λΌλ μλ―Έ, λͺ¨λ₯΄λ μ¬λμ μ λ³΄κ° 0μ΄ λλλ‘ λκ² λ€λ μλ―Έ
- κ°λ¨ μκ°: μλ‘μ λν μ¬μ μ 보λ₯Ό ν΄μ¦λΌλ κ²μμ ννλ‘, 미리 μ 곡ν¨μΌλ‘μ¨ μ²« λνλ₯Ό μμνκ² λμμ€λ€.
- μΉν΄μ ΈμΌ νλ μ¬λμ μ«μ, μκ°μ μΌλ‘ μ 곡
- λ³ΈμΈμ μ 보μ λν ν΄μ¦ μ μ
- ν΄μ¦ μ 곡μμ ν΄μ¦ νκΈ°
μ΄λͺ
μ§ (@thingineeer) |
λ°μ΅λ² (@parkikbum) |
μμμ (@EunsuSeo01) |
κΉλ―Όμ (@kms0233) |
---|---|---|---|
ν νλ©΄ λ° μ΄λ μ½λ λ·° ꡬν | ν΄μ¦ μμ± λ° λ§ν¬ μμ± λ·° ꡬν | ν΄μ¦ νκΈ° λ° κ²°κ³Ό λ·° ꡬν | μ€νλμ λ° μ¨λ³΄λ© λ·° ꡬν |
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
- μ΄μ μμ±
- λΈλμΉ μμ±
- λΈλμΉ add, commit, push β PR κ³Όμ κ±°μΉκΈ°
- μ΅μ 1λͺ
"Approve" μμ΄μΌ merge (κ°μ λ¨Έμ§ κΈμ§ νλ©΄ μνΈ μ λͺ
bypass) - λ¨Έμ§ ν ( ν΄λΉ λΈλμΉ λ°λ‘ μ κ±° )
- 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μ ν¬ν¨νκ³ μμ
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 λ©μλλ νλ‘ν μ½λͺ μΌλ‘ λ€μμ€νμ΄μ€λ₯Ό ꡬλΆν©λλ€.
μ’μ μ:
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
μ κ°μ κΈ°λ₯μΌλ‘, μ°κ΄λ μ½λμ κ·Έλ μ§ μμ μ½λλ₯Ό ꡬλΆν λ μ¬μ©ν©λλ€.
βββ Application
βΒ Β βββ AppDelegate.swift
βΒ Β βββ Base.lproj
βΒ Β βββ Info.plist
βΒ Β βββ SceneDelegate.swift
βββ Data
βΒ Β βββ Dto.swift
βββ Global
βΒ Β βββ Extension
βΒ Β βββ Literals
βΒ Β βββ Resource
βββ Network
βΒ Β βββ Base
βΒ Β βββ Network.swift
βββ Presentation
βββ TabBar
βββ ViewControllers
βββ Views