Good

  • ์•„์นจ 7์‹œ์— ์ถœ๊ทผํ•˜๊ณ  7์‹œ ์ดํ›„์— ํ‡ด๊ทผํ–ˆ๋‹ค.
  • ํˆฌ์ž๊ธ€ ์—ญ์‹œ ๊พธ์ค€ํžˆ ์˜ฌ๋ ธ๋‹ค.
  • ํด๋ฆฐ ์ฝ”๋“œ ๋จผ์ € ์ฝ๊ณ  ์ •๋ฆฌ๋ฅผ ๊พธ์ค€ํžˆ ํ–ˆ๋‹ค.
  • ์ €๋… ์ƒ๋Ÿฌ๋“œ ๋จน๊ธฐ ์‹œ๋„ํ–ˆ๋‹ค.
  • ํšŒ์‚ฌ ๋ชจ๋‹ˆํ„ฐ ์„ค์ •, ํ‚ค๋ณด๋“œ, ๋งˆ์šฐ์Šค, ํŠธ๋ž™ํŒจ๋“œ ๊ตฌ๋งคํ–ˆ๋‹ค.
  • ๋งฅ ์ŠคํŠœ๋””์˜ค ๊ตฌ์ž…ํ–ˆ๋‹ค.

Bad

  • ์ž์˜์ ์œผ๋กœ frame ๊ธฐ๋ฐ˜์œผ๋กœ ์š”์ฒญ์ฃผ์‹  ๊ฒƒ์„ autolayout์œผ๋กœ ์ฒ˜๋ฆฌํ–ˆ๋‹ค. ๋ชจ๋ฅด๋ฉด ์ข€๋” ์ •ํ™•ํ•˜๊ฒŒ ๋ฌผ์–ด๋ณด๋Š” ์Šต๊ด€์„ ๊ฐ€์ง€์ž. ์™œ ๊ตณ์ด autolayout์œผ๋กœ ํ•˜๋Š”์ง€..? ํ•œ๋ฒˆ๋งŒ ๋” ๋ฌผ์–ด๋ณด๋ฉด ํ•œ๋ฒˆ์— ์ผํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ธ”๋กœ๊ทธ ๊ธ€์„ ๋” ๋งŽ์ด ๋ชป์ผ๋‹ค. ์•„๋ฌด๋ž˜๋„ ๊ธ€ ํ•˜๋‚˜ ์“ฐ๋Š”๋ฐ ์ž๋ฃŒ์กฐ์‚ฌ๊ฐ€ ๋งŽ์•„์„œ ๊ทธ๋Ÿฐ ๋“ฏํ•˜๋‹ค.
  • ํŠธ์œ„ํ„ฐ์— ๊ธ€์„ ๋งŽ์ด ๊ณต์œ ํ•˜์ง€ ๋ชปํ–ˆ๋‹ค. ์•„์นจ์— ์กฐ๊ธˆ ๊ท€์ฐฎ๋”๋ผ๋„ ์˜ฌ๋ฆฌ๋Š” ์Šต๊ด€์„ ๊ฐ€์ง€์ž.
  • ์ €๋…์— ๋” ์ž์ฃผ ์ƒ๋Ÿฌ๋“œ๋ฅผ ๋จน์ง€ ๋ชปํ–ˆ๋‹ค.
  • ์˜ท์„ ์‚ฌ๋Š”๋ฐ ์ž๊พธ ์ž˜๋ชป๋œ ์‚ฌ์ด์ฆˆ๋ฅผ ์‚ฐ๋‹ค. ์™œ์ง€?
  • ํ‚ค๋ณด๋“œ ์‹ธ๊ฒŒ ์‚ฌ๊ฒ ๋‹ค๊ณ  ์ค‘๊ณ ๋กœ ์ƒ€๋‹ค๊ฐ€ ํ‚ค๋ณด๋“œ๊ฐ€ 3๊ฐœ๊ฐ€ ๋˜์—ˆ๋‹ค. ๊ทธ๋ƒฅ ์ฒ˜์Œ๋ถ€ํ„ฐ ํšŒ์‚ฌ์—์„œ ์ƒˆ๊ฑธ๋กœ ์‚ด๊ฑธ. ๋•Œ๋กœ๋Š” ์ƒˆ๊ฑฐ์‚ฌ๋Š”๊ฒŒ ์ข‹์„ ์ˆ˜๋„ ์žˆ๋‹ค.

Learns

  • ๊ฐ•์ œ ํฌ๋ž˜์‹œ๋‚ด๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ: indexOutOfRange, divisionByZero
  • Autolayout์ด ๋ฌด์กฐ๊ฑด ์ ์œผ๋กœ ์ข‹์€ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. computed cost๊ฐ€ ๋“ค์–ด๊ฐ€๊ธฐ ๋•Œ๋ฌธ์— frame๊ธฐ๋ฐ˜์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋” ์ข‹์„ ์ˆ˜ ์žˆ๋‹ค.
  • Clean code๋ฅผ ๋ณด๋ฉด์„œ ์ธ์ˆ˜ ๊ด€๋ จํ•ด์„œ ์ธ์ˆ˜๊ฐ€ ์ ์„ ์ˆ˜๋ก ์ข‹๋‹คํ–ˆ๋Š”๋ฐ, ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ ์•ฝ๊ฐ„์€ ์ƒ์ถฉ๋˜๋Š” ๋‚ด์šฉ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์•„ ์งˆ๋ฌธํ–ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ๋Œ€๋กœ ์ƒํƒœ๊ฐ’์„ ์ตœ๋Œ€ํ•œ ์—†์• ๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐ€๋Š” ๊ฒƒ์ด ํ…Œ์ŠคํŠธ๋‚˜ ์œ ์ง€๋ณด์ˆ˜์— ์žˆ์–ด ๋ณด๋‹ค ์ข‹๋‹ค๋Š” ๊ฒฐ๋ก ์ด ๋‚ฌ๋‹ค. ์ธ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๋ผ๋ฉด ๋”ฐ๋กœ struct๋ฅผ ๋งŒ๋“ ๋‹ค๋˜์ง€, ํ•จ์ˆ˜๋ฅผ ์ชผ๊ฐœ์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์„ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๋ณด๋‹ค ์ข‹๊ฒ ๋‹ค.
  • Exception์˜ ๊ฒฝ์šฐ case๋กœ ๋‚˜๋ˆ„์ง€๋ง๊ณ  subclassing์„ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•˜์ž.
  • factory๋กœ ๋‹คํ˜•์„ฑ์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • addSubview์‹œ [view1, view2].forEach { self.view.addSubview($0)์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.
private extension UIButton {
 
    func update(isSelected: Bool) {
        self.titleLabel?.text.map {
            let textColor = isSelected ? UIColor(rgb: 0x0abe16) : UIColor(rgb: 0x6b707a)
            self.setAttributedTitle($0 + TextStyle.body13(weight: .bold).foregroundColor(textColor).center, for: .normal)
        }
 
        self.titleLabel?.attributedText.map {
            let margin: CGFloat = 12.0
            self.frame.size.width = $0.size().width + margin * 2
        }
    }
}
 
  • ์ด๋ ‡๊ฒŒ map์„ ์‚ฌ์šฉํ•ด์„œ optional์„ ๋ฒ—๊ฒจ๋‚ด๊ณ  ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์ž‘์—…์„ ํ•˜๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๋‹ค.
  • extension ์‚ฌ์šฉ ๋ฐฉ์‹
    • ํฌ๊ธฐ์— ๋”ฐ๋ผ์„œ? (UIViewController+Delegate.swift)
    • ์•„์˜ˆ ์˜๋ฏธ๋ก ์ ์œผ๋กœ ๋‹ค๋ฅธ ์œ„์น˜์— ๋‘๋Š” ๊ฒฝ์šฐ (Model โ†’ View Structure), fileprivate
    • ์ง„์งœ extension์˜ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๋Š” ๊ฒฝ์šฐ (๋ณธ ์˜๋ฏธ๋ณด๋‹ค๋Š” ์•„๋ฅ˜๋Š๋‚Œ)
internal var openedPublisher: AnyPublisher<InfoPublisher, Never> {
    self.publisher
        .compactMap { $0?.toDisplay(self.stationData) }
        .eraseToAnyPublisher()
}
 
private let publisher = PassthroughSubject<RealtimeAPI.Subways.Station?, Never>()
 
func someFunction() {
    self?.publisher.send(result)
}
  • ์ด๋Ÿฐ์‹์œผ๋กœ ๋ฐ–์œผ๋กœ ๋‚ด์ฃผ๋Š” publisher์™€ ์•ˆ์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” publisher๋ฅผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

Commitment

  • ๋‹ค์Œ๋‹ฌ์—๋Š” ํ—ˆ๋จผ๋ฐ€๋Ÿฌ ์˜์ž๋ฅผ ์‚ด ๊ฒƒ ๊ฐ™์•„ ๊ธˆ์ „์ ์œผ๋กœ ์ค€๋น„ํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.
  • ์ด๋ฒˆ๋‹ฌ ์ง€์ถœ์ด ๋งŽ์•˜๋‹ค. ๋ฐ”์ง€, ํ‹ฐ ๋“ฑ์„ ๊ตฌ๋งคํ–ˆ๋‹ค. ๋‹ค์Œ๋‹ฌ์€ ์ค„์—ฌ์•ผ ํ•œ๋‹ค.
  • 7-19๋Š” ์ง€ํ‚ค๋Š” ์Šต๊ด€์œผ๋กœ ๊ฐ€์ ธ๊ฐ„๋‹ค.
  • ์•„์นจ์—๋Š” ๊ธฐ์ˆ  ๊ธ€์„ ์“ฐ๋Š” ์Šต๊ด€์„ ๊ฐ€์ง€์ž. ํด๋ฆฐ ์ฝ”๋“œ๋Š” ์ฃผ๋ง์— ํ•˜์ž.
  • ์œ ํŠœ๋ธŒ ๋ง๊ณ  ์ฑ…์„ ์ฝ๋Š” ์Šต๊ด€์„ ๊ฐ€์ง€์ž. ํ™•์‹คํžˆ ์ฝ์–ด๋ณด๋‹ˆ ์ฑ…์ด ์ •๋ณด์Šต๋“ ์†๋„ ์ธก๋ฉด์—์„œ ๋ณด๋‹ค ๋น ๋ฅด๊ณ , ์ƒ์ƒํ•˜๊ฒŒ ๋˜์–ด ๋” ์žฌ๋ฏธ์žˆ๋Š” ๋“ฏ ํ•˜๋‹ค.
  • ํ‰์ผ์— ๋ชจ๋“ ๊ฑธ ์Ÿ์•„๋ถ“๊ณ  ์ฃผ๋ง์— ์šด๋™ํ•˜์ž. ์ฃผ๋ง์—๋Š” ๊ผญํ•ด์•ผ ํ•œ๋‹ค. ์ƒ์กด ์šด๋™์ด๋‹ค.
  • ๋‚ด๊ฐ€ ๋‚˜๋ฅผ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ๋ด์ฃผ๊ธธ ๋ฐ”๋ผ๋“ฏ, ๋‚จ๋„ ๊ทธ๋ ‡๊ฒŒ ๋ณด์ž. ํ•ญ์ƒ ๊ทธ๋Ÿด ์ˆ˜ ์žˆ๋‹ค๋Š” ์ƒ๊ฐ์„ ๊ฐ€์ง€๊ณ  ์‚ด์ž.
  • ๋‚ด ์†๋งˆ์Œ์„ ๊ทธ๋Œ€๋กœ ๋‚ด๋น„์น˜๋ฉด ์•ˆ๋œ๋‹ค. ์ธ์ƒ์„ ํฌ๊ณ  ๋„“๊ฒŒ ๋ณด์ž.