-
Notifications
You must be signed in to change notification settings - Fork 8
Home
[label] issue_num : commit message
[feat] #2 : ํ๋ ์ ๋๋ฉ์ด์
์ ์ฉ
[bug] #4 : ํ๋ ์ ๋๋ฉ์ด์
๋ฌดํ ๋ฐ๋ณต ํ์
[fix] #5 : ํ๋ ์ ๋๋ฉ์ด์
๋ฌดํ ๋ฐ๋ณต ํ์ ํด๊ฒฐ'#' number : ์ด์ ๋ฒํธ
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 : ๋ฆฌํํ ๋งํ ๊ฒฝ์ฐ ์ฌ์ฉ
main : release๋ก๋ถํฐ squash merge๋ฅผ ๋ฐ๋ branch
release : develop์ผ๋ก๋ถํฐ ์คํ๋ฆฐํธ ๋จ์๋ก merge๋ฅผ ๋ฐ๋ branch
develop : ๊ฐ์ธ feature branch๋ก๋ถํฐ squash merge๋ฅผ ๋ฐ๋ branch
feature : feature ๊ด๋ จ๋ ๋ธ๋์น๋ ์ด๋ฆ/feature์ด๋ฆ์ผ๋ก ์์ฑ
labs: ์คํ์ค ๋ธ๋์น ์ฃผ์ feature๊ฐ ์๋ ์คํ์ด ๋๋ ๊ธฐ๋ฅ๋ค์ ์ถ๊ฐํด๋ณด๋ branch, main branch์ ๋๊ธฐํ
-
๋ค์ฌ์ฐ๊ธฐ์๋ ํญ(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์๋ก ์ค์ ํ๋ฉด ํธ๋ฆฌํฉ๋๋ค.
- ๋จ,
๋ชจ๋ ์ํฌํธ๋ ์ํ๋ฒณ ์์ผ๋ก ์ ๋ ฌํฉ๋๋ค.
๋ด์ฅ ํ๋ ์์ํฌ๋ฅผ ๋จผ์ ์ํฌํธํ๊ณ , ๋น ์ค๋ก ๊ตฌ๋ถํ์ฌ ์๋ํํฐ ํ๋ ์์ํฌ๋ฅผ ์ํฌํธํฉ๋๋ค.
- ํด๋์ค ์ด๋ฆ์๋ 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() { // ... }
- Tap(๋๋ ๋ค ๋)*์ย
- ๋ณ์ ์ด๋ฆ์๋ 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:๋ฅผ ์ฌ์ฉํด์ ์ฐ๊ด๋ ์ฝ๋๋ฅผ ๊ตฌ๋ถ์ง์ต๋๋ค. -
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 { // ... }