๊ณต๋ถ€ ์—ฐ์Šต์žฅ :-)

TIL_2019_03

|

2019.03.05

    func onMapView(_ mapView: NMapView!, didChangeMapCenter location: NGeoPoint) {
        mapView.setMapCenter(location)
        self.fetchNearMarts(from: location)
    }
  • ๋„ค์ด๋ฒ„์ง€๋„์—์„œ POIData๋งŒ๋“ค์–ด์„œ ๋งˆ์ปค๋ฅผ ๊ทธ๋ฆฌ๋Š” ๋™์ž‘๊ณผ mapview๋ฅผ ๊ทธ๋ฆฌ๋Š” ๋™์ž‘์„ ๋™์‹œ์— ํ• ๋•Œ ๋ฌธ์ œ๋ฐœ์ƒ
  • ์ˆ˜์ •์ „: ์œ„์น˜๋ฅผ ํŠธ๋ž™ํ‚นํ•˜๋Š”๊ณณ(locationManager)์ด๋‚˜ ์ง€๋„๋ฅผ ์„ผํ„ฐ๋กœ ์˜ฎ๊ฒจ ๊ทธ๋ฆฌ๋Š” ๊ณณ(didMapCenterMoved)์—์„œ fetchNearMarts๋ฅผ ํ˜ธ์ถœํ•จ
  • ํ˜„์ƒ: ๋จผ์ € ๋งต๋ทฐ๊ฐ€ ํ‘œ์‹œ๋๋‹ค๊ฐ€ - ์œ„์น˜ ํŠธ๋ž™ํ‚น - ๋งˆ์ปค๊ทธ๋ ค์ง€๋Š” ๋ ˆ์ด์–ด๊ฐ€ ๋‚˜ํƒ€๋‚˜๊ณ  ๋งต๋ทฐ ์„ผํ„ฐ๊ฐ€ ์˜ฎ๊ฒจ์ง€๋ฉด์„œ ์ง€๋„๊ฐ€ ์ƒˆ๋กœ ์•ˆ๊ทธ๋ ค์ง
  • ๊ทผ๋ฐ ์ƒˆ๋กœ ์•ˆ๊ทธ๋ ค์ง€๋Š”๊ฒŒ ๋งจ๋‚  ๋นˆ ํ™”๋ฉด์ด ์•„๋‹ˆ๋ผ ์–ดใ„ท์ฉ”๋•Œ๋Š” ๋ฐ˜์”ฉ ๊ทธ๋ ค์ง€๊ณ  ๋Š๋ฆฌ๊ฒŒ ๊ทธ๋ ค์ง€๊ณ  ๋˜ ์–ด๋–จ๋•Œ๋Š” ๊ฑฐ์˜ ํ™”๋ฉด์˜ 1/5๋งŒ ๊ทธ๋ ค์ง
  • ์˜ˆ์ƒ๋˜๋Š” ์›์ธ: ์ง€๋„์˜ center๋ฅผ ์˜ฎ๊ธฐ๊ณ  ๋‚˜์„œ ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ๋ฅผ fetchํ•˜๊ณ  ๋งˆ์ปค๋ฅผ ๊ทธ๋ฆฌ๋Š” ๋™์ž‘์„ ํ•˜๋ฉด์„œ ์ง€๋„ ํ‘œ์‹œํ•˜๋ ค๋Š” ์ž‘์—…์ด๋ž‘ ๋งˆ์ปค ํ‘œ์‹œํ•˜๋ ค๋Š” ์ž‘์—…์ด ์ถฉ๋Œ(์–ด์ฉŒ๋ฉด ๋ฐ๋“œ๋ฝ - ๋‘˜๋‹ค ๋งต๋ทฐ๋ฅผ ๊ทธ๋ฆฌ๋Š” ๋™์ž‘์ด๊ณ  ์„ฑ๊ฒฉ์ด ๊ฐ™์€ ๋™์ž‘์ด๋ผ๋ฉด ๊ฐ™์€ ์Šค๋ ˆ๋“œ์—์„œ ์ง„ํ–‰๋  ์ˆ˜๋„ ์žˆ๊ธฐ๋•Œ๋ฌธ์—โ€ฆ?)๋‚˜์„œ ๊ทธ๋Ÿด์ˆ˜๋„ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•จ
  • ํ•ด๊ฒฐ: ์ง€๋„์˜ ์„ผํ„ฐ๊ฐ€ ์˜ฎ๊ฒจ์กŒ์„๋•Œ ๋งต๋ทฐ๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ๋™์ž‘๊ณผ ๋งˆ์ปค ๊ทธ๋ฆฌ๋Š” ๋™์ž‘์„ ๋ถ„๋ฆฌํ•˜๋‹ˆ๊นŒ ์ž˜ ํ‘œ์‹œ๋จ

  • Swift์˜ enum์˜ rawValue๋ฅผ tuple๋กœ ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?: ๊ทธ๋ƒฅ์€ ๋ชปํ•จ
    enum ErrorCode: (Int, String) {
      case Generic_Error = (0, "Unknown")
      case DB_Error = (909, "Database")
    }
    
  • ์ด๋Ÿด๋ฐ”์—” ์ฐจ๋ผ๋ฆฌ ๊ตฌ์กฐ์ฒด๋ฅผ ๋งŒ๋“ค์ž
    struct Trouble {
      static let Generic_Error = (0, "Unknown")
      static let DB_Error = (909, "Database")
    }
    
  • ๊ทธ๋ƒฅ ๋‚ด๊ฐ€ enum์˜ rawValue๊ฐ’์œผ๋กœ ์“ฐ๊ณ ์‹ถ์€ ํŠœํ”Œํƒ€์ž…์„ RawRepresentableํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉด ๋œ๋‹ค.
    enum ErrorCode: RawRepresentable {
      case Generic_Error
      case DB_Error
    
      var rawValue: (Int, String) {
          switch self {
          case .Generic_Error: return (0, "Unknown")
          case .DB_Error: return (909, "Database")
          }
      }
    
      init?(rawValue: (Int, String)) {
          switch rawValue {
          case (0, "Unknown"): self = .Generic_Error
          case (909, "Database"): self = .DB_Error
          default: return nil
          }
      }
    }
    
  • ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ ๋‚˜๋Š” UIAlertViewController์— ๋„์šธ ์—๋Ÿฌ๋ฉ”์‹œ์ง€๋ฅผ staticํ•œ ๋ณ€์ˆ˜์— ๋‹ด์•„๋†“๊ณ  ์‹ถ์–ด์„œ enum์„ ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€ programdescription์„ ์ ๋Š” enum์ด ๋„ˆ๋ฌด ์ปค์ ธ์„œ ๋ถ„๋ฆฌํ•˜๋ ค๋Š” ์šฉ๋„์˜€์œผ๋ฏ€๋กœ ๊ทธ๋ƒฅ struct๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹์„ ์„ ํƒํ–ˆ๋‹ค.

    • โ€˜ErrorAlertDescriptionโ€™ declares raw type โ€˜(title: String, message: String)โ€™, but does not conform to RawRepresentable and conformance could not be synthesized
    • enum์˜ rawValue๋Š” RawRepresentableํ”„๋กœํ† ์ฝœ์„ ์ค€์ˆ˜ํ•œ ํƒ€์ž…๋งŒ ์„ ์–ธํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ํ”„๋กœํ† ์ฝœ์€ ์ปค์Šคํ…€ํƒ€์ž…์„ ๋˜๋Œ๋ ค๋„(back and forth) ์—ฐ๊ด€๋œ rawValue๊ฐ’์œผ๋กœ ์›๋ž˜์˜ ๊ฐ’์„ ์œ ์ง€ํ•˜์—ฌ ๋˜๋Œ๋ฆด ์ˆ˜ ์žˆ๋„๋ก ๋ณด์žฅํ•ด์ค€๋‹ค.
    • RawRepresentable์€ ํฌ๊ฒŒ enumerations with raw value types์™€ option sets ๋‘๊ฐ€์ง€ ์นดํ…Œ๊ณ ๋ฆฌ ํƒ€์ž…์œผ๋กœ ๋‚˜๋ˆ ์„œ ๋ณผ ์ˆ˜ ์žˆ์Œ.
    • string, integer, or floating-point raw type๊ณผ ๊ฐ™์€ ํƒ€์ž…์„ ์—ด๊ฑฐํ˜•์œผ๋กœ ๋งŒ๋“ค๋ฉด, ์Šค์œ„ํ”„ํŠธ ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•Œ์•„์„œ RawRepresentableํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•ด์ค€๋‹ค. (ํŠœํ”Œ์€ ์—ฌ๊ธฐ ์—†๋Š” ํƒ€์ž…์ด๋‹ˆ๊นŒ ์•ˆ๋œ๋‹ค๋Š” ์–˜๊ธฐ)

2019.03.09

ํ• ๊ฒƒ
  • ๋„ค์ด๋ฒ„์ง€๋„ ์ƒˆ๋กœ์šด api ์‚ฌ์šฉํ•˜๊ธฐ
  • cocoapod์—์„œ ์„ค์น˜ ๊ฐ€๋Šฅ.. ์ง„์ž‘์— ๋งŒ๋“ค์–ด์ฃผ์ง€ ๊ทธ๋žฌ๋ƒ ใ… ใ… ใ… ใ…  ์ƒˆ๋กœ ๋‹ค์‹œ ์‹น ๊ฐˆ์•„์•ผ๋จ
  • cocoapod์—์„œ ์ƒˆ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ํ•˜๋Š”๊ฒŒ ๋ถ€๋‹ด์Šค๋Ÿฌ์šด๊ฒŒ, ๋งˆํŠธ์‰ฌ๋Š”๋‚  ํ”„๋กœ์ ํŠธ๊ฐ€ ๋‹จ์ผ ํƒ€๊ฒŸ์ด ์•„๋‹ˆ๋ผ์„œ ํƒ€๊ฒŸ๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ๋””ํŽœ๋˜์‹œ๋ฅผ ์„ค์ •ํ•˜๋Š”๊ฒŒ ์ข€ ์–ด๋ ต๋‹ค.ใ… ใ…  ์˜ค๋Š˜์€ ๋„ค์ด๋ฒ„์ง€๋„๋„ cocoapod์—์„œ ์„ค์น˜ํ•˜๋ฉด์„œ ๊ทธ๋ฌธ์ œ๋„ ๊ฐ™์ด ํ•ด๊ฒฐํ•ด๋ณด๊ธฐ๋กœ!

2019.03.13

  • ์ „์ฒด ํ™”๋ฉด ์Šคํฌ๋กค๋ทฐ safeArea ํŠ•๊น€ ์ฆ์ƒ
  • UIScrollView์˜ ํ”„๋กœํผํ‹ฐ๋ฅผ ์กฐ์ •ํ•˜๋ฉด ๋จ!
  • contentInsetAdjustmentBehavior
  • https://medium.com/rosberryapps/ios-safe-area-ca10e919526f
  • full screen scrollview์—์„œ ์Šคํฌ๋กค ๋™์ž‘์ด, ์ œ์ผ top์ด๋‚˜ bottom์œผ๋กœ ์Šคํฌ๋กค์„ ์›€์ง์˜€์„๋•Œ content inset์ด ์ž๋™์œผ๋กœ ์กฐ์ •๋˜์–ด ์ปจํ…์ธ ๊ฐ€ ๊ฑธ๋ฆฌ๋“ฏ์ด ๋‚ด๋ ค๊ฐ€๊ฑฐ๋‚˜ ์˜ฌ๋ผ๊ฐ€๊ฒŒ๋œ๋‹ค.
  • contentInsetAdjustmentBehavior์˜ ๊ธฐ๋ณธ ๊ฐ’์€ automatic์ด๊ณ , ์•Œ์•„์„œ safeArea๋ฅผ ์žก์•„์ค€๋‹ค.

2019.03.14

  • Swift Algorithm club Binary Search tree

2019.03.21

  • GCD block ๊ณผ animation block์—์„œ ์™œ retain cycle์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๊ฐ€์— ๋Œ€ํ•œ ํ† ๋ก  https://www.reddit.com/r/swift/comments/8fyxlr/why_gcd_and_animate_block_is_not_strong_reference/

2019.03.28

SKStoreProductViewController๋Š” ์•ฑ์Šคํ† ์–ด์—๋ฅผ ๋ชจ๋‹ฌ ๋ทฐ๋กœ ๋„์›Œ์ฃผ๋Š” ๋ทฐ์ปจ์ž„. ๊ทผ๋ฐ ์ด๊ฑธ๋กœ ์—…๋ฐ์ดํŠธ๊ฐ€ ์•ˆ๋ ๊ฑฐ๊ฐ™์€๋ฐโ€ฆ? ์—…๋ฐ์ดํŠธ๋Š” ์•ฑ์ด ๊บผ์ง„ ์ƒํƒœ์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๋Š”๋ฐ ๋ชจ๋‹ฌ๋ทฐ๋กœ ์•ฑ์Šคํ† ์–ด๊ฐ€ ๋„์›Œ์ง€๊ณ โ€ฆ ์ผ๋‹จ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ˆ„๋ฅด๋ฉด ์—…๋Žƒ์ด ์‹คํ–‰๋˜๋ฉด์„œ ์•ฑ์ด ์ข…๋ฃŒ๋ ํ…๋ฐ ์ด๋ฏธ ์—…๋ฐ์ดํŠธ๋ฅผ ์ž…๋ ฅํ–ˆ์œผ๋‹ˆ๊นŒ ์„ค์น˜ํ•˜๋ผ๋Š” ๋ช…๋ น์€ ์ž…๋ ฅ๋œ๊ฑฐ๊ณ  ๊ทธ ๋’ค๋ผ์„œ ์ƒ๊ด€์ด์—†๋Š”๊ฑด๊ฐ€..? ์ฐพ์•„๋ณด๋‹ˆ๊นŒ ๋‚˜์˜ ๋‘๋ฒˆ์งธ ์ถ”์ธก์ฒ˜๋Ÿผ ์—…๋ฐ์ดํŠธ๊ฐ€ ์‹คํ–‰๋˜๋ฉด ์•ฑ์ด kill๋˜๊ณ  ์•Œ์•„์„œ ์—…๋ฐ์ดํŠธ๋˜๋Š”๊ฑฐ ๊ฐ™์Œ(์ฐธ๊ณ ) !! ์•„๋‹˜. ๊ทธ๋ƒฅ openurl๋กœ ์•ฑ ์™ธ๋ถ€์—์„œ ์•ฑ์Šคํ† ์–ด๋ฅผ ํ‚ด. ์ด๋ ‡๊ฒŒ ๋ฐ”๊พผ ์ด์œ ๋Š” ๋Ÿฐ์น˜์Šคํฌ๋ฆฐ์—์„œ ๋ฉˆ์ถค์ƒํƒœ๋กœ (๋งํ•˜์ž๋ฉด rootViewController์„ ๋Ÿฐ์น˜์Šคํฌ๋ฆฐ์œผ๋กœ ๋Œ€์ฒดํ•œ ์ƒํƒœ๋กœ) ์•ฑ์Šคํ† ์–ด ๋ทฐ์ปจ์„ ์—ฌ๋Š”๊ฑด๋ฐ modal๋กœ ์—ฌ๋‹ˆ๊นŒ ์ƒ๊ด€์—†์„ ๊ฒƒ ๊ฐ™๊ธดํ•˜์ง€๋งŒ, ๊ทธ๋ž˜๋„ ๋Ÿฐ์น˜์Šคํฌ๋ฆฐ์—์„œ ๋ฉˆ์ถฐ์žˆ๋Š”๋ฐ Storekit์„ ๋‚ด๋ถ€์—์„œ ์—ฌ๋Š”๊ฒŒ ์ข€ ์–ด์ƒ‰ํ•˜๊ฒŒ ๋Š๊ปด์กŒ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—…๋ฐ์ดํŠธ๋ฅผ ๋ˆ„๋ฅด๋ฉด ์•ฑ์ด kill๋˜๋Š”๊ฒŒ ๋ถ„๋ช…ํ•œ๋ฐ ๊ผญ ์•ฑ ๋‚ด๋ถ€์—์„œ ์•ฑ์Šคํ† ์–ด ๋ทฐ์ปจ์„ ๋„์šฐ๋Š”๊ฒŒ ๋…ผ๋ฆฌ์ ์œผ๋กœ ๋งž๋Š” ๋ฐฉ์‹์ธ๊ฐ€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์ด ์žˆ์—ˆ๋‹ค.

ํ…Œ์ŠคํŠธํ•ด๋ณด๋‹ˆ๊นŒ itms-apps:// ์Šคํ‚ด์ด ๋™์ž‘ํ•ด์„œ ์•ฑ์Šคํ† ์–ด๊ฐ€ ์™ธ๋ถ€์—์„œ ์—ด๋ ธ๊ณ , ๋‚ด ์•ฑ์€ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์žˆ๋Š” ์ƒํƒœ. ์—ฌ๊ธฐ์„œ ์•ฑ์„ ๋‹ค์‹œ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๋Žƒํ•˜๋Š” ๋™์ž‘์„ ํ•˜๋‹ˆ ์‹œ์Šคํ…œ์ด ์•ฑ์„ terminated์‹œํ‚ค๋Š” ๊ฒƒ์„ ํ™•์ธํ–ˆ๋‹ค.

์ฐพ์•„๋ณด๋‹ˆ๊นŒ ์•ฑ์—์„œ Storekit์„ ์‚ฌ์šฉํ•˜๋ฉด, ์•ฑ์ถ”์ฒœ๊ณผ ๋ฆฌ๋ทฐ / ์ธ์•ฑ ๊ตฌ๋งค / ์• ํ”Œ๋ฎค์ง ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์„ค๋ช…๋˜์–ด์žˆ๋‹ค.

Comments