O-O-wl / store-app

์Šคํ† ์–ด ์•ฑ ๐Ÿช๐Ÿฌ

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Store - app

STEP 1 - 2

์ง„ํ–‰๊ธฐ๊ฐ„(2019/12/4 ~ 2019/12/7)

์Šคํฌ๋ฆฐ์ƒท 2019-12-07 ์˜ค์ „ 12 36 17

๊ณต๋ถ€ํ•œ ๋‚ด์šฉ ๐Ÿ‘จโ€๐Ÿ’ป

  • intrinsicContentSize ์‚ฌ์ด์ฆˆ๋ฅผ ์ด์šฉํ•œ ์ปจํ…ํŠธ์™€ border ์‚ฌ์ด์— ๊ฐ„๊ฒฉ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ๊ฒŒ ๊ตฌํ˜„

    ์Šคํฌ๋ฆฐ์ƒท 2019-12-07 ์˜ค์ „ 1 04 27
    override var intrinsicContentSize: CGSize {
            var contentSize = super.intrinsicContentSize
            contentSize.height += 10
            contentSize.width += 10
            return contentSize
        }
  • NSAttributeString ํ•™์Šต

    • strikethrough ์†์„ฑ์„ ์ด์šฉํ•œ ์ทจ์†Œ์„  ๊ตฌํ˜„
    • https://www.hackingwithswift.com/articles/113/nsattributedstring-by-example ์˜ˆ์ œ ํ•™์Šต
    • NSAttributeString ์„ ๊ตฌํ˜„ํ•˜๋ฉฐ, ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์ด ๋ช…ํ™•ํ•ด์ง€์ง€ ์•Š์•„์„œ, snapKit์„ ์ฐธ๊ณ ํ•˜์—ฌ ๋น„์Šทํ•œ ์ปจ๋ฒค์…˜์„ ์œ ์ง€ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด๋ณด์•˜๋‹ค.
// ๋ฑƒ์ง€ ๊ตฌํ˜„
let attributedText = NSMutableAttributedString(string: text)
  
attributedText.beauty
      .fgColor(style.textColor)
			.bgColor(style.bgColor)
      .align(style.align)
      .font(style.font)
  
label.attributedText = attributedText

// ์ทจ์†Œ์„  ๊ตฌํ˜„
let price = NSMutableAttributedString(string: price)
price.beauty.align(.center).strikethrough(1)
priceLabel.attributedText = price
  • ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์„œ๋น„์Šค๋ฅผ ์ถ”์ƒํ™”ํ•˜์—ฌ ๊ตฌํ˜„

    • DummyData , StubService ํด๋ž˜์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์—ฌ ์ถ”ํ›„ ๋ณ€๊ฒฝ์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ตฌํ˜„.
    ์Šคํฌ๋ฆฐ์ƒท 2019-12-07 ์˜ค์ „ 1 00 50

STEP3 - ์ปค์Šคํ…€ ํ—ค๋” ๋ทฐ ๊ตฌํ˜„

์ง„ํ–‰๊ธฐ๊ฐ„(2019/12/9 ~ 2019/12/10)

์Šคํฌ๋ฆฐ์ƒท 2019-12-10 ์˜ค์ „ 5 07 25

๊ณต๋ถ€ํ•œ ๋‚ด์šฉ๐Ÿ‘จโ€๐Ÿ’ป

  • CustomHeaderView ๊ตฌํ˜„

    • BadgeView ์žฌ์‚ฌ์šฉ์„ ์œ„ํ•œ ๊ตฌํ˜„
  • Category ๋ณ„๋กœ ๋‹ค๋ฅธ EndPoint๊ตฌํ˜„์„ ์œ„ํ•ด ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ ํŒจํ„ด์„ ์ ์šฉํ•œ MulitEndPoint ๊ตฌํ˜„

    • EndPoint.swift

    • protocol EndPoint: URLRequestConvertible {
          
          var baseURL: URL { get }
          var method: HTTP.Method { get }
          var task: HTTP.Task { get }
          var headers: HTTP.Headers? { get }
          var sampleData: Data? { get }
      }
      
    • MultiEndPoint.swift

      // MARK: - MultiEndPoint
      
      enum MultiEndPoint {
          
          case endPoint(EndPoint)
          
          var endPoint: EndPoint {
              switch self {
              case .endPoint(let endPoint):
                  return endPoint
              }
          }
      }
      
      // MARK: - EndPoint
      
      extension MultiEndPoint: EndPoint {
          
          var baseURL: URL {
              return endPoint.baseURL
          }
          
          var method: HTTP.Method {
              return endPoint.method
          }
          
          var task: HTTP.Task {
              return endPoint.task
          }
          
          var headers: HTTP.Headers? {
              endPoint.headers
          }
          
          func asURLRequest() -> URLRequest {
              return endPoint.asURLRequest()
          }
          
          var sampleData: Data? {
              return endPoint.sampleData
          }
      }
  • DispatchGroup , ์ˆœ์„œ๊ฐ€ ๋ณด์žฅ๋˜๊ฒŒ ๊ตฌํ˜„

    • DispatchQueue ๋ฅผ .serial ํ•˜๊ฒŒ ํ•˜์—ฌ, ๋น„๋™๊ธฐ์ ์œผ๋กœ ์š”์ฒญ์€ ํ•˜๋˜ ์ˆœ์„œ๋ฅผ ๋ณด์žฅํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

    •  let dispatchGroup = DispatchGroup()
       let serialQueue = DispatchQueue(label: "store.fetch", qos: .default)
    • DispatchGroup๋ฅผ ์ด์šฉํ•ด์„œ, ๋ชจ๋“  Task๊ฐ€ ์™„๋ฃŒ๋œ๋‹ค์Œ completion์„ 1๋ฒˆ๋งŒ ํ˜ธ์ถœํ•˜๊ฒŒ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

    • dispatchGroup.notify(queue: .global()) {
                  completion(.success(stores))
              }

ํ”ผ๋“œ๋ฐฑ ๐Ÿง

์„œ๋น„์Šค ์ฝ”๋“œ์— DummyMain ์ด๋‚˜ DummySoup ์„ ์จ์•ผ๋งŒ ํ•˜๋‚˜์š”?
Dummy-๊ฐ€ ๋ถ™์œผ๋ฉด ์–ด๋–ค ์šฉ๋„์ผ๊นŒ์š”?
์ž„์‹œ๋กœ ์“ฐ๋Š”๊ฑด์ง€ ์ •์ƒ์ ์ธ์ง€ ์ฝ”๋“œ๋กœ ํ•˜๋“œ์ฝ”๋”ฉํ•˜๊ธฐ ๋ณด๋‹ค๋Š” ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ์ง€ ์ƒ์œ„์—์„œ ์ง€์ •ํ•ด์ฃผ๋Š” ๊ฒŒ ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ViewModel์„ ์˜์กด์„ฑ์„ ์ฃผ์ž…ํ•ด์„œ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•ด์ง€๋‹ˆ๊นŒ์š”.
  • ๋ฐ›๋Š” ์ชฝ์€ ์ถ”์ƒ์ ์œผ๋กœ ๋ฐ›๋˜, ์ฃผ์ž…ํ•ด์ฃผ๋Š” ์ชฝ์ด ๊ตฌ์ฒดํƒ€์ž…์„ ๊ฒฐ์ •ํ•ด์„œ ์ฃผ์ž…ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ๋‹ค๊ณ  ๋Š๊ผˆ๋‹ค.



STEP4 - Cocoa Pods

  • Cocoa Pods

    • ํ”„๋กœ์ ํŠธ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์˜์กด์„ฑ์„ ๊ด€๋ฆฌํ•œ๋‹ค
    • Swift/Objectieve - C ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ ์˜์กด์„ฑ๊ด€๋ฆฌ์ž
  • Dependency manager

    • ์„œ๋“œํŒŒํ‹ฐ ์˜์กด์„ฑ์„ ์‰ฝ๊ฒŒ ๋”ํ•˜๊ฑฐ๋‚˜, ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜, ์—…๋ฐ์ดํŠธ๋ฅผ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“œ๋Š” ๋„๊ตฌ
    • dependency manager makes it easy to add, remove, update and manage third-party dependencies used by your app.
  • Podfile

    • ํ”„๋กœ์ ํŠธ๋‚ด์— ํ•˜๋‚˜ ๋˜๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ํƒ€๊ฒŸ์˜ ์˜์กด์„ฑ์˜ ๋ช…์„ธ

    • Podfile.lock - pod install ์‹œ ํ•ด๋‹น ๋ฒ„์ „์„ ์žก์•„๋‘์–ด ์˜์กดํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜์–ด๋„ ๊ธฐ์กด ๋ฒ„์ „ ์œ ์ง€๊ฐ€๋Šฅ

      • Form
    • target 'MyApp' do
        use_frameworks!
        pod 'Alamofire', '~> 3.0'
      end
  • Target

    • buildํ•  product์™€ product๋ฅผ build ํ•˜๊ธฐ ์œ„ํ•œ instruction๋“ค์„ ํฌํ•จํ•œ๋‹ค.
    • Target ํ•˜๋‚˜๋Š” ํ•˜๋‚˜์˜ Project๋งŒ์„ ๊ฐ€์ง„๋‹ค.
  • Project

    • Source code, including header files and implementation files
    • Libraries and frameworks, internal and external
    • Resource files
    • Image files
    • Interface Builder (nib) files
  • workspace

    • ํ”„๋กœ์ ํŠธ ์—ฌ๋Ÿฌ๊ฐœ๋ฅผ ํฌํ•จํ•˜๋Š” ์ž‘์—…๊ณต๊ฐ„
  • build configuration

    • product ์˜ build ๊ณผ์ •์—์„œ ์ˆ˜ํ–‰๋˜์•ผ๋งŒ ํ•˜๋Š” ๊ฒƒ๋“ค์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ํฌํ•จํ•œ๋‹ค.
    • Build Setting + Build phase ๊ฐ€ ์œ„์— ํ•ด๋‹น๋œ๋‹ค.
    • Build setting ์€ setting title (ํƒ€์ดํ‹€) / definition (์„ค์ • ๊ฐ’) ์œผ๋กœ ๋‚˜๋‰œ๋‹ค.
  • scheme

    • Build , test , Run ๋“ฑ Target Product์— ํ•  ํ–‰๋™

About

์Šคํ† ์–ด ์•ฑ ๐Ÿช๐Ÿฌ


Languages

Language:Swift 98.4%Language:Objective-C 1.2%Language:Ruby 0.4%