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

2019 ๋„ค์ด๋ฒ„ ํ…Œํฌ์ฝ˜์„œํŠธ - iOS

|

7์›” 12์ผ์— ๊ทธ๋ฆฐํŒฉํ† ๋ฆฌ์—์„œ ์ง„ํ–‰ํ•˜๋Š” ๋„ค์ด๋ฒ„ ํ…Œํฌ์ฝ˜์„œํŠธ์— ๋‹ค๋…€์™”์Šต๋‹ˆ๋‹ค. ์˜ค๋žœ๋งŒ์˜ ์ปจํผ๋Ÿฐ์Šค์ด๊ธฐ๋„ ํ–ˆ๊ณ , ์ฃผ์ œ๊ฐ€ ๋„ˆ๋ฌด ์–ด๋ ต์ง€ ์•Š๊ณ  ๋„์›€๋˜๋Š” ์ฃผ์ œ๋ผ์„œ ์žฌ๋ฏธ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ™์ด ๊ณต๋ถ€ํ–ˆ๋˜ ๋™๋ฃŒ๋“ค๋„ ๋งŒ๋‚  ์ˆ˜ ์žˆ์–ด์„œ ๋” ์ข‹์•˜์Šต๋‹ˆ๋‹ค.(๊ฑฐ์˜ ๋™์ฐฝํšŒ ์ˆ˜์ค€์œผ๋กœ ์•„๋Š” ์‚ฌ๋žŒ์ด ๋งŽ์•˜๋˜โ€ฆใ…‹ใ…‹ใ…‹) ๊ทธ ์œ ๋ช…ํ•œ ๊ทธ๋ฆฐํŒฉํ† ๋ฆฌ ๋„์„œ๊ด€๋„ ๋“ค์–ด๊ฐ€๋ดค๋Š”๋ฐ ์ข‹๋”๊ตฐ์š” ใ…œ_ใ…œ ๋„ค์ด๋ฒ„ ์ž„์ง์› & ์ •์ž ์ฃผ๋ฏผ๋“ค ๋ถ€๋Ÿฝ์Šต๋‹ˆ๋‹คโ€ฆ

1. ๋„ค์ด๋ฒ„์ง€๋„ SDK-๋„ค์ด๋ฒ„ ์ง€๋„ ๋ฐ‘๊ทธ๋ฆผ์„ ๊ทธ๋ฆฌ๋Š” SDK๊ฐœ๋ฐœ์ž๊ฐ€ ํ•˜๋Š” ์ผ

  • ๋ฐœํ‘œ์ž๋ฃŒ
  • ์ƒˆ๋กญ๊ฒŒ ์ถœ์‹œํ•œ ๋„ค์ด๋ฒ„ ์ง€๋„2.0์˜ ๊ฐœ์„ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์ „๋ฐ˜์ ์ธ ์„ค๋ช…์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ์ธ์ ์œผ๋กœ๋Š” SDK๊ฐœ๋ฐœ์ž๊ฐ€ ์–ด๋–ป๊ฒŒ ์ผ์„ ํ•˜๋Š”์ง€ ์ข€ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ์•Œ๊ณ ์‹ถ์—ˆ๋Š”๋ฐ, ๊ฑฐ์˜ ํ™๋ณด..? ์„ฑ๊ณผ๋ณด๊ณ ์— ๊ฐ€๊นŒ์šด ๋ฐœํ‘œ์—ฌ์„œ ๊ฐœ์ธ์ ์œผ๋กœ ์กฐ๊ธˆ ์•„์‰ฌ์› ์Šต๋‹ˆ๋‹ค.
  • ๋งต๋ฐ•์Šค๋ผ๋Š” ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐœ๋ฐœํ–ˆ๋‹ค๋Š”๊ฒŒ ์˜์™ธ์˜€์Œ. (๋‹ค ๋งŒ๋“ค์—ˆ์„ ์ค„ ์•Œ์•„์•˜๋Š”๋ฐ..)
    • ํฌํฌ & ์žฌ๊ฐœ๋ฐœ : ์ž˜ ๋˜์–ด์žˆ๋Š” ๊ฒƒ์„ ์ œ์™ธํ•œ ์ˆ˜์ •์ด ํ•„์š”ํ•œ๋ถ€๋ถ„์€ ์ „๋ถ€ ์ˆ˜์ •ํ–ˆ๋‹ค๊ณ  ํ•จ
  • ์˜คํ”ˆ์†Œ์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์จ์„œ ํ˜‘์—…์ด ๋” ์šฉ์ดํ–ˆ๋‹ค.

2. ๋“ค์ˆจ์— ํ˜‘์—… ๋‚ ์ˆจ์— ํด๋ฆฐ์ฝ”๋“œ

  • ๋ฐœํ‘œ์ž๋ฃŒ
  • ์‚ฌ๋‚ด ์ปจ๋ฒค์…˜/ํ˜‘์—…/์•„ํ‚คํ…์ณ/TDD์— ๊ด€ํ•œ ๋‚ด์šฉ
  • ๋‹ค์–‘ํ•œ ๊ด€์ ์„ ๊ฐ€์ง„ ์—ฌ๋Ÿฟ์ด ๋ชจ์—ฌ์„œ ์ผ์˜ ํšจ์œจ์„ฑ์„ ๋†’์ด๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ฝ”๋“œ์Šคํƒ€์ผ์„ ํ†ตํ•ฉํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค. ๋‹ค๋งŒ ๋ชจ๋“  ๋ฃฐ์„ ์ ์šฉํ• ๋•Œ๋Š” ํ•ฉ์˜๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์ด ํ•„์ˆ˜์ด๊ณ , ๊ณตํ†ต์˜ ๋ฃฐ๋กœ ํŒ๋‹จํ•˜๋Š” ๊ธฐ์ค€์€ ์ด ๊ตฌ๋ฌธ์˜ ์˜๋„์™€ ์—ญํ• ์ด ๋ฌด์—‡์ธ์ง€์— ์ดˆ์ 
  • SwiftLint๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋ฅผ ํ†ตํ•ด์„œ ๋„์–ด์“ฐ๊ธฐ๋‚˜ indent ๋“ฑ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋†“์น˜๊ธฐ ์‰ฌ์šด ์‚ฌ์†Œํ•œ ๊ฒƒ๋“ค์€ ์ž๋™ํ™”ํ•˜์—ฌ ๋ณด์ •, ๊ฐœ๋ฐœ์ž๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์คŒ
    • SwiftLint๋Š” ์Šค์œ„ํ”„ํŠธ ๊ฐœ๋ฐœ์ž๋“ค์ด ๊ฐ€์žฅ ๋งŽ์ด ์“ฐ๋Š” ์ปจ๋ฒค์…˜ ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งŒ๋“ค๋•Œ ์‚ฌ์šฉํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์ฒ˜์Œ์— ์ ์šฉํ–ˆ์„๋• Swift์ปจ๋ฒค์…˜์— ์•ˆ๋งž์œผ๋ฉด warning๋„ ์•„๋‹ˆ๊ณ  error๊ฐ€ ๋– ์„œ ๋นŒ๋“œ์กฐ์ฐจ ํ•  ์ˆ˜ ์—†๋Š”๋ฐ, ํˆด์ด ๋งž์ถฐ์ฃผ๋Š” ๊ทœ์น™์œผ๋กœ ์ฐจ์ธฐ ๊ฐœ์„ ํ•ด๋‚˜๊ฐ€๋‹ค๋ณด๋ฉด ๊ณต์‹ ์ปจ๋ฒค์…˜์— ๋งž๋Š” ์ฝ”๋“œ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์•˜์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ๋ฐœํ‘œ์—์„œ ์„ค๋ช…ํ•œ๋Œ€๋กœ indent๋‚˜ ๊ณต๋ฐฑ ๋“ฑ์— ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š๊ณ  ๋กœ์ง์—๋งŒ ์ง‘์ค‘ ํ•  ์ˆ˜ ์žˆ์–ด์„œ ์ข‹์•˜์Šต๋‹ˆ๋‹ค.
    • SwiftLint

MVCํƒˆ์ถœ๊ธฐ

  • ์ฝ”์ฝ”์•„ํ„ฐ์น˜ ํ”„๋ ˆ์ž„์›Œํฌ์˜ MVC๋Š” ์‚ฌ์‹ค ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์—ญํ• ๋งŒ ํ•˜๊ธฐ ํž˜๋“  ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค. iOS์˜ MVC ์•„ํ‚คํ…์ณ์˜ ๊ฐ€์žฅ ํฐ ๋‹จ์ ์œผ๋กœ๋Š” Massive View Controller ์ด์Šˆ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด์˜ ๋‹จ์ ์„ ์ด์•ผ๊ธฐํ•˜๊ณ  MVVM๊ณผ Rx๋ฅผ ์ ‘๋ชฉํ•ด์„œ ์•„ํ‚คํ…์ณ๋ฅผ ๋ณ€ํ˜•ํ•œ ํ›„๊ธฐ๋ฅผ ๋“ค์„ ์ˆ˜ ์žˆ์–ด์„œ ํฅ๋ฏธ๋กœ์› ์Šต๋‹ˆ๋‹ค.
  • ์ฝ”์ฝ”์•„ํ„ฐ์น˜ ํ”„๋ ˆ์ž„์›Œํฌ์˜ MVC๋Š” ์‚ฌ์‹ค ๋‹จ์ ์ด ๋งŽ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ๋Š” ์‚ฌ์‹ค ๋ทฐ์™€ ๋„ˆ๋ฌด๋‚˜ ๋ฐ€์ ‘ํ•˜๊ฒŒ ์—ฐ๊ด€๋˜์–ด์žˆ๋‹ค. ๊ฐœ๋ฐœํ•˜๋‹ค๋ณด๋ฉด ์ˆœ์‹๊ฐ„์— ๋ทฐ์˜ ๋ชจ๋“  ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๋ฅผ ์„ ์–ธํ•ด์„œ ๊ด€๋ฆฌํ•˜๊ณ  ๋„คํŠธ์›Œํฌ ์š”์ฒญ๊นŒ์ง€ ๋ณด๋‚ด๊ฒŒ ๋˜๋ฉด์„œ ์ ์  massiveํ•˜๊ฒŒ ๋ณ€ํ™”ํ•˜๊ฒŒ๋œ๋‹ค. ๋‹จ์œ„ํ…Œ์ŠคํŠธ๋„ ํž˜๋“ค์–ด์ง„๋‹ค. ๋ทฐ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด๊นŒ์ง€ ๋”ํ•ด์ง€๋ฉด ์™„์ „โ€ฆ hell.
  • MVVC์„ ์ฑ„ํƒ : ์ฝ”์ฝ”์•„ ์˜์กด๋„๋ฅผ ์ตœ๋Œ€ํ•œ ์ค„์ด๊ณ  ์ˆœ์ˆ˜ํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๊ฐ€์ ธ์•ผํ•œ๋‹ค๋Š” ๋ชฉ์ ์œผ๋กœ ์‹œ์ž‘.
  • ๋ทฐ๋ชจ๋ธ <-> ๋ทฐ์™€ ๋Š์Šจํ•œ ์ข…์†์„ฑ / ๋ฐ”์ธ๋”ฉ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” Rx๋ฅผ ์ฑ„ํƒ.
  • View == ์˜ˆ์œ ๊ป๋ฐ๊ธฐ : layout(), attribute() ๊ทธ๋ฆฌ๊ณ  ๋ทฐ๋ชจ๋ธ๊ณผ์˜ ๋ฐ”์ธ๋”ฉ๋งŒ ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์—ญํ•  ์ œํ•œ
  • ViewBindable: ๋ทฐ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์ด๋ฒคํŠธ๋ฅผ ํ•ธ๋“ค๋งํ• ์ˆ˜์ž‡๋„๋ก ์—ฐ๊ฒฐํ•˜๋Š” ์—ญํ• 
  • ViewModel: ๋ทฐ์˜ ์•ก์…˜์ด ์ผ์–ด๋‚ฌ์„๋•Œ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ๊ตฌํ˜„
  • Model: ๋„คํŠธ์›Œํฌ ๋“ฑ ์—ฐ๊ฒฐ, Business Logic๋งŒ์„ ์ „๋‹ด

3. ์‰ฝ๊ณ  ์žฌ๋ฏธ์žˆ๋Š” iOS๋””๋ฒ„๊น… - LLDB Command

  • ๋ฐœํ‘œ์ž๋ฃŒ
  • LLDB๋Š” Xcodeํˆด์— ๋‚ด์žฅ๋˜์–ด์žˆ๋Š” ๋””๋ฒ„๊ฑฐ์ž…๋‹ˆ๋‹ค. ๋‹ค์–‘ํ•œ LLDB ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ์‰ฝ๊ณ  ํŽธ๋ฆฌํ•˜๊ฒŒ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
  • ์ง€๊ธˆ๋„ ๊ฐœ๋ฐœํ• ๋•Œ breakpoint์™€ LLDB๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด์„œ ๋””๋ฒ„๊น…ํ•˜๊ณคํ–ˆ๋Š”๋ฐ, ์ข€ ๋” ํšจ์œจ์ ์ด๊ณ  ๋‹ค์–‘ํ•˜๊ฒŒ ๋””๋ฒ„๊น… ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ฒŒ๋˜์–ด ์•ž์œผ๋กœ ๋งŽ์ด ์‘์šฉํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•œ๋ฒˆ์— ์ปค๋งจ๋“œ๋ฅผ ์™ธ์›Œ์„œ ์‚ฌ์šฉํ•˜์ง„ ๋ชปํ•˜๊ฒ ์ง€๋งŒ, ์–ด๋–ค ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€๋„ ๋ชฐ๋ผ์„œ ์•„์˜ˆ ์ฐพ์•„๋ณด์ง€๋„ ์•Š๊ณ  ์‚ฌ์šฉ๋„ ๋ชปํ•˜๋Š”๊ฑฐ๋ž‘ ์ด๋Ÿฐ๊ฒŒ ์žˆ๋Œ€~ ์ฏค์€ ์•Œ๊ณ  ํ•„์š”ํ• ๋•Œ ์ฐพ์•„์„œ ์“ธ์ˆ˜ ์žˆ๋Š”๊ฑฐ๋ž‘ ์ฒœ์ง€์ฐจ์ด์ธ ๊ฒƒ ๊ฐ™์•„์š”. ์ด๋Ÿฐ ์˜๋ฏธ์—์„œ ์ €์—๊ฒŒ ๊ต‰์žฅํžˆ ๋„์›€๋˜๋Š” ์„ธ์…˜ ์ค‘์— ํ•˜๋‚˜์˜€์Šต๋‹ˆ๋‹ค! (๋””๋ฒ„๊น… ์ปค๋งจ๋“œ๊ฐ€ ํ•„์š”ํ• ๋•Œ ์•ž์œผ๋กœ ๊ณ„์† ๋ฐœํ‘œ์ž๋ฃŒ๋ฅผ ์ฑ™๊ฒจ ๋ณผ ๊ฒƒ ๊ฐ™๋„ค์š”โ€ฆ!)

4. ARKit, CoreML, Turi Create ์‚ผํ˜•์ œ

  • ๋ฐœํ‘œ์ž๋ฃŒ
  • CoreMLํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ด์šฉํ•ด์„œ ๋ฏธ๋‹ˆ ํ”„๋กœ์ ํŠธ ํ•œ ํ›„๊ธฐ๋ฅผ ์„ค๋ช…ํ•˜๋ฉด์„œ ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์„ ์„ธํŒ…ํ• ๋•Œ ์–ด๋–ค ์ ์„ ์ฃผ์˜ํ•ด์•ผํ•˜๋Š”์ง€, ์‰ฝ๊ณ  ๊ฐ€๋ณ๊ฒŒ ์“ฐ๊ธฐ์—” ์–ด๋–ค ํˆด์„ ์‚ฌ์šฉํ–ˆ๋Š”์ง€ ์„ค๋ช…ํ•˜๋Š” ์„ธ์…˜์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ง€ํ์— ์–ผ๊ตด์„ ํ•ฉ์„ฑํ•˜๋ฉด ์žฌ๋ฐŒ๊ฒ ๋‹ค๋Š” ์•„์ด๋””์–ด๋กœ ์‹œ์ž‘๋˜์–ด ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ๋ง์— ์‹œํ–‰์ฐฉ์˜ค๋ฅผ ๊ฒช์€ ์ด์•ผ๊ธฐ, ๊ฒฐ๊ตญ์— ๋” ๋ชจ๋ธ๋ง์— ํšจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ•์„ ์ ์šฉํ•ด์„œ ์„ฑ๊ณตํ–ˆ๋‹ค๋Š” ์ด์•ผ๊ธฐ๋ฅผ ๋“ฃ๊ณ  ๋‚˜๋‹ˆ ์–ด๋ ต๊ฒŒ๋งŒ ๋Š๊ปด์กŒ๋˜ ๋จธ์‹ ๋Ÿฌ๋‹์ด ์ข€ ๋” ์นœ์ˆ™(?)ํ•ด์ง€๋Š” ๊ณ„๊ธฐ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!
  • ARKit: ์• ํ”Œ์ด ์ œ๊ณตํ•˜๋Š” ์ฆ๊ฐ•ํ˜„์‹ค ํ”„๋ ˆ์ž„์›Œํฌ
    • https://developer.apple.com/documentation/arkit
  • Create ML: ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ ์ œ๊ณต ํ”„๋ ˆ์ž„์›Œํฌ
    • https://developer.apple.com/documentation/createml
  • Turi Create: ์ปค์Šคํ…€ ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋ฐœ๋‹ฌ์‹œํ‚ฌ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • https://github.com/apple/turicreate

5. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๋†’์ด๋Š” ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋งŒ๋“ค๊ธฐ

  • ๋ฐœํ‘œ์ž๋ฃŒ
  • ์• ๋‹ˆ๋ฉ”์ด์…˜์ด ์™œ ํ•„์š”ํ• ๊นŒ? ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•ด์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ๊ธฐ๋Šฅ, ๊ฐ ๊ธฐ๋Šฅ์„ ์ž์—ฐ์Šค๋Ÿฝ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์–ด๋–ค ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ข‹์„์ง€ ์•ˆ๋‚ดํ•˜๋Š” ์„ธ์…˜์ด์—ˆ์Šต๋‹ˆ๋‹ค.
    • ํ˜•ํƒœ๋Š” ๊ธฐ๋Šฅ์„๋”ฐ๋ฅธ๋‹ค(Louis H. Sullivan) - ๋””์ž์ธ์„ ํ• ๋•Œ๋Š” ์ด๊ฒŒ ์–ด๋””์— ์“ฐ์ผ๊ฒƒ์ธ์ง€ ๋ฏธ๋ฆฌ ๊ฒฐ์ •ํ•˜๊ณ  ๊ทธ ์ดํ›„์— ํ˜•ํƒœ์™€ ์šฉ๋„์—๋งž๋Š” ๋””์ž์ธ๊ณผ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์„ ํƒํ•ด์•ผํ•œ๋‹ค.
    • ์• ํ”Œ์˜ HIG๋ฌธ์„œ์— ๋”ฐ๋ฅด๋ฉด ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ์ปจํ…์ธ ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋„๊ตฌ. ๋”ฐ๋ผ์„œ ์ปจํ…์ธ ์™€ ๋งฅ๋ฝ์„ ์ž˜ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •์ œ๋œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ๋„ฃ๋Š”๊ฒŒ ํ•„์š”ํ•˜๋‹ค.
      • HIG: Human Interface Guideline
    • ์• ๋‹ˆ๋ฉ”์ด์…˜์˜ ์š”์†Œ๋ฅผ ํŒŒ์•…ํ•˜๋ฉด ์‰ฝ๊ฒŒ ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
      • 3 ์š”์†Œ: ํŠธ๋ฆฌ๊ฑฐ/ํƒ€๊ฒŸ/ํƒ€์ž„
      • ํŠน์ • ์ด๋ฒคํŠธ(ํŠธ๋ฆฌ๊ฑฐ)๊ฐ€ ๋ฐœ์ƒํ–ˆ์„๋•Œ UI์š”์†Œ(ํƒ€๊ฒŸ)๋ฅผ ์‹œ๊ฐ„์— ๋”ฐ๋ผ(ํƒ€์ž„) ๋ณ€ํ™”์‹œํ‚ค๋Š” ๊ฒƒ

TIL_2019_07

|

2019.07.05

  • UIDatePicker์—์„œ 24์‹œ๊ฐ„ ๋ชจ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ: Danish๋ชจ๋“œ !
  • ์—…๋ฌดํ• ๋•Œ๋Š” UITextField์˜ done ๋ฒ„ํŠผ ๋™์ž‘์„ extension์— ๊ตฌํ˜„๋œ ๋™์ž‘์„ ์‚ฌ์šฉํ•˜๋„๋ก ๋˜์–ด์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฆฌ๋ธŒ๋žœ๋”ฉ์— ๋“ค์–ด๊ฐ€๋ฉด์„œ ํ…์ŠคํŠธํ•„๋“œ์˜ done์ด๋‚˜ return ๋™์ž‘์— ์ถ”๊ฐ€์ ์ธ ์ฝœ๋ฐฑ์„ ๊ตฌํ˜„ํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ฒจ์„œ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•ด์•ผํ•˜๋‚˜ ๋ง‰๋ง‰ํ–ˆ๋Š”๋ฐ, ์˜์™ธ๋กœ ์‰ฝ๊ฒŒ ํ•ด๊ฒฐํ–ˆ๋‹ค. xib์—์„œ sentEvent๋ฅผ didEndOnExit์— ์›ํ•˜๋Š” ๋™์ž‘์„ ๊ตฌํ˜„ํ•ด์ฃผ๋ฉด ๋œ๋‹ค!

2019.07.07

  • ์ฃผ๋ง์— ํ•œ ์—„์ฒญ๋‚œ ์‚ฝ์งˆโ€ฆIBOutletCollection์— ์—ฐ๊ฒฐํ• ๋• ํ•˜๋‚˜ํ•˜๋‚˜์”ฉ ํ•ด์•ผ์ง€ ํ•œ๊บผ๋ฒˆ์— ์„ ํƒํ•˜๊ณ  ๋“œ๋ž˜๊ทธํ•˜๋ฉด ๋“œ๋ž˜๊ทธ ์‹œ์ž‘์ ์ธ ๋ฒ„ํŠผ๋งŒ ์ฝœ๋ ‰์…˜์— ์—ฐ๊ฒฐ๋จโ€ฆ.ใ… 0ใ… ์ด๋Ÿด์ˆ˜๊ฐ€. ๋ณดํ†ต IBOutletCollection์€ ์ž˜ ์•ˆ์จ์„œ ๋ชฐ๋ž๋Š”๋ฐ, ๋ฉ€ํ‹ฐ ์„ ํƒํ•˜๊ณ  ํ•œ๊บผ๋ฒˆ์— ๋“œ๋ž˜๊ทธํ•˜๋ฉด ํ•œ ์•„์šธ๋ › ๋ณ€์ˆ˜์— ๋‹ค ์—ฐ๊ฒฐ๋˜๋Š”์ค„ ์•Œ์•˜๋‹ค. (ํ•˜์ง€๋งŒ ์•„๋‹ˆ์—ˆ๋‹ค.) ์•„๋ฌด๋ฆฌ ์ฝ”๋“œ๋ฅผ ๋œฏ์–ด๋ณด๊ณ  ๋””๋ฒ„๊น…์„ ํ•ด๋ด๋„ ๋กœ์ง์€ ๋งž๋Š”๋ฐ ๋ทฐ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์–ด์„œ ์ขŒ์ ˆ์Šค๋Ÿฌ์› ๋Š”๋ฐ, ๊ฐ€๋” ์ด๋ ‡๊ฒŒ ํ•ด๊ฒฐํ•˜๊ณ  ํž˜๋น ์ง€๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค ใ…Ž_ใ…Ž!

2019.07.10

  • forEach๋ฅผ ๋Œ๋‹ค๊ฐ€ ์กฐ๊ฑด์ด ๋งž์€ element๋ฅผ ์ฐพ์•„์„œ ์ž‘์—…์„ ํ•˜๊ณ  ๋ฐ”๋กœ break๋‚˜ return์œผ๋กœ ๋ฐ˜๋ณต๋ฌธ์„ ๋๋‚ด๊ณ ์‹ถ๋‹ค๋ฉด forEach๊ฐ€ ์•„๋‹Œ filter๋‚˜ firstํ•จ์ˆ˜๋ฅผ ์“ฐ์ž!
    • ๊ทผ๋ฐ element์ค‘์—์„œ ๋‹จ ํ•œ๊ฐœ๋งŒ ์ฐพ์•„์„œ ์ž‘์—…ํ•ด์•ผํ•˜๋Š ์ƒํ™ฉ์ด๋ผ๋ฉด first๊ฐ€ ๋” ์ ํ•ฉ. (์Šค์œ„ํ”„ํŠธ ๊ณ ์ฑ ํ•จ์Šˆโ€ฆ๋„˜ ์ข‹๋‹น..)
      if let category = self.selectedCategory {
          if let categoryButton = self.categoryButtons.first(where: { $0.titleLabel?.text == category }) {
              categoryButton.doSomething()
          }
      }
    

2019.07.20

  • ํด๋กœ์ € ๋ธ”๋Ÿญ ๋‚ด๋ถ€์„œ์˜ lldb์—์„œ self๋ฅผ ์ ‘๊ทผ ๋ชปํ•˜๋‚˜?
    • forEach ๋ฌธ ์•ˆ์— ๋ธŒ๋ ˆ์ดํฌ ํฌ์ธํŠธ๊ฐ€ ๊ฑธ๋ ค์žˆ์„๋•Œ ๊ฐ’์„ ๋ด์•ผํ•ด์„œ ์ฐ์–ด๋ดค๋Š”๋ฐ, ์š”๋ ‡๊ฒŒ ๋‚˜์™”๋‹ค. ์ฐพ์•„๋ด์•ผ์ง• ``` (lldb) po objUser?.strRegion error: :3:1: error: use of unresolved identifier 'objUser'; did you mean 'objc_super'? objUser?.strRegion ^~~~~~~ objc_super

(lldb) po objUser error: :3:1: error: use of unresolved identifier 'objUser'; did you mean 'objc_super'? objUser ^~~~~~~ objc_super

(lldb) po self.objUser?.strRegion error: :3:1: error: use of unresolved identifier 'self' self.objUser?.strRegion ^~~~


### 2019.07.21
- ๋‚˜์˜ ๋งˆํŠธ ์•ฑ์˜ ์ˆ™์›... ์œ„์น˜๊ฒ€์ƒ‰...๊ด€๋ จ ์ž‘์—…ํ•˜๊ธฐ!
  - ์œ ์ €์œ„์น˜ ๊ฐ์ฒด์— isValid ๊ตฌํ˜„ํ•˜๊ธฐ
  - ์œ ์ €์œ„์น˜ ๊ธฐ๋ฐ˜์œผ๋กœ ์ฃผ๋ณ€ ๋งˆํŠธ ํƒ์ƒ‰ํ•˜๋Š” fetch() ํ•จ์ˆ˜ ์ ๊ฒ€
  - ์œ ์ € ์ขŒํ‘œ๊ฐ€ ์žกํžˆ๋ฉด ๋ฐ”๋กœ ํ”„๋กœํผํ‹ฐ ์„ธํ„ฐ์—์„œ fetch()๋ฅผ ์ฝœํ•˜๊ฒŒ ๋˜์–ด์žˆ๋Š”๋ฐ, ์œ ์ €์˜ ์œ„์น˜๊ฐ€ 0,0์ด๋‚˜ ๋ง๋„ ์•ˆ๋˜๋Š” ๋‚œ์ˆ˜๊ฐ€ ์žกํ˜€์„œ ๋„ค์ด๋ฒ„ ์—”ํด๋ผ์šฐ๋“œ์— ๋ฌธ์˜๋ฅผ ๋‚จ๊ธฐ๊ธฐ๋„ ํ•˜๊ณ  ๋„ค์ด๋ฒ„ ํ…Œํฌ์ฝ˜์„œํŠธ์—์„œ ๋„ค์ด๋ฒ„ ์ง€๋„ SDK๊ฐœ๋ฐœํ•œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ง์ ‘ ์–ด๋–ป๊ฒŒํ•˜๋ฉด ์ข‹์„๊นŒ ๋ฌผ์–ด๋ณด๊ธฐ๋„ํ–ˆ๋˜..๊ทผ๋ฐ ์šฐ์—ฐํžˆ ์ธํ„ฐ๋„ท ๋‹ต๋ณ€ ์ฃผ์‹ ๋ถ„์ด๋ž‘ ๋„ค์ด๋ฒ„ํ…Œํฌ์ฝ˜์„œํŠธ์—์„œ ๋ฐœํ‘œํ•˜์‹  ๋ถ„์ด๋ž‘ ๊ฐ™์€ ๋ถ„์ด์…”์„œ ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆ ๋ณด๋‹ˆ, ์‹ค๋‚ด์—์„œ ์œ ์ € ์œ„์น˜๋ฅผ ์žก์„๋•Œ ๋ถ€์ •ํ™•ํ•˜๊ฒŒ ์žกํž ์ˆ˜ ์žˆ์–ด์„œ ๋‚œ์ˆ˜๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์ผ ์ˆ˜ ์žˆ๊ณ  ๋„ค์–ด๋ฒ„์ง€๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” inValid์†์„ฑ์€ (๋„ค์ด๋ฒ„์ง€๋„๊ฐ€ ์ „์„ธ๊ณ„ ์ง€๋„ ์„œ๋น„์Šค๋ฅผ ๋ชฉํ‘œ๋กœ ํ•˜๊ณ ์žˆ๊ธฐ๋•Œ๋ฌธ์—..) 0 ์ดํ•˜์˜ ์ˆ˜๋งŒ ์žก๋Š”๋‹ค๊ณ  ํ•˜์…”์„œ 0,0์ด๋‚˜ ๋‚œ์ˆ˜๊ฐ€ ๊ฑธ๋Ÿฌ์ง€์ง€์•Š๋Š”๋‹ค๊ณ  ํ•˜์…จ์Œ. ๊ฒฐ๊ตญ CoreLocation์„ ์‚ฌ์šฉํ•ด์„œ ์œ„์น˜๋ฅผ ์žก๊ฑฐ๋‚˜ ์ •ํ™•ํ•œ ์œ„์น˜๋ฅผ ํŒ๋ณ„ํ•˜๋Š” ๋กœ์ง์„ ์ปค์Šคํ…€ํ•˜๋Š”๊ฒƒ์œผ๋กœ ๊ฒฐ๋ก ์ด ๋‚ฌ๋Š”๋ฐ, ์‚ฌ์‹ค ๋‚˜์˜ ๋ฌธ์ œ์ƒํ™ฉ์€ ์œ ์ € ์œ„์น˜๊ฐ€ ๋ถ€์ •ํ™•ํ•˜๊ฒŒ ์žกํžˆ๋Š”๊ฒŒ ์•„๋‹ˆ๊ณ  ์œ ์ € ์œ„์น˜๊ฐ€ ์žกํžˆ๊ธฐ ์ „์— 2์ฐจ๋ก€์ •๋„ ๋‚œ์ˆ˜๊ฐ€ ์ฐํžˆ๋Š”๊ฒŒ ๋ฌธ์ œ๋ผ์„œ, ๊ตญ๋‚ด ์œ„/๊ฒฝ๋„๊ฐ€ ์œ ํšจํ•œ ๊ฐ’์œผ๋กœ Range๋ฅผ ์žก์•„์ฃผ๋ฉด ํ•ด๊ฒฐ๋  ๊ฒƒ ๊ฐ™๋‹ค!

- tick mark UISlider ๋งŒ๋“ค๊ธฐ
-

- awesome Swift

func compareDifference(compare: NMGLatLng ,value: Double) -> Bool { return self.lat - compare.lat > 0.0005 || self.lng - compare.lng > 0.0005 // if self.lat - compare.lat > 0.0005 || self.lng - compare.lng > 0.0005 { // return true // } else { // return false // } } ```

2019.07.22

  • ์Šคํƒ๋ทฐ๋ฅผ ํ’ˆ์€ ํ…Œ์ด๋ธ”๋ทฐ ์…€: ์˜คํ† ๋ ˆ์ด์•„์›ƒ์ด ๋นŒ๋“œ ๋‹จ๊ณ„๊นŒ์ง€๋Š” ๋ฉ€์ฉกํ•˜๊ณ  ์‹ฌ์ง€์–ด ํ™”๋ฉด์— ์˜ฌ๋ผ์™”์„๋•Œ๋„ ๋ฌธ์ œ์—†์ด ๋ถ™๋Š”๋ฐ ์ฝ˜์†”์— breaking ์˜คํ† ๋ ˆ์ด์•„์›ƒ ๊ด€๋ จ ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€๊ฐ€ ์–ด๋งˆ๋ฌด์‹œํ•˜๊ฒŒ๋– ์„œโ€ฆ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ž˜ ๋œฏ์–ด๋ณด๋‹ˆ ์…€ ์•ˆ์˜ ์Šคํƒ๋ทฐ์— subView๋กœ ๋“ค์–ด๊ฐ€๋Š” ์นด๋“œ๋ทฐ ํ•˜๋‚˜ํ•˜๋‚˜์˜ ์˜คํ† ๋ ˆ์ด์•„์›ƒ์ด ๋ถ€๋ค ์ดํ‚น ๋ผ์„œ ๋‚˜๋Š” ๋ฉ”์‹œ์ง€๋“ค์ด์—ˆ๋‹ค. ๊ทธ ์—๋Ÿฌ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋‚˜๋ฆ„์˜ ๋…ธํ•˜์šฐ๋Š” ๊ฑฐ๊ธฐ์„œ ์ด๊ฑฐ๊นจ์ง€๊ณ  ์ €๊ฑฐ๊นจ์ง€๊ณ  ์—„์ฒญ ๊ธธ๊ฒŒ ์จ๋†“์€ ๊ธ€ ๋ฐ‘์— ์ด๋Ÿฌ์ด๋Ÿฌํ•œ ๊ฒƒ๋“ค์ด ๋ญ๋•Œ๋ฌธ์— ๊นจ์กŒ๋ƒ๋ฉด ์ด๊ฑฐ์•ผ: ํ•˜๊ณ  ๋‚˜์˜ค๋Š” ๋‘ ์ค„์งœ๋ฆฌ ๋ฉ”์‹œ์ง€๊ฐ€ ์žˆ๋Š”๋ฐ ๊ฑฐ๊ธฐ์„œ ์–ด๋–ค ์˜คํ† ๋ ˆ์ด์•„์›ƒ ์„ค์ •๋•Œ๋ฌธ์— ์ด๋Ÿฐ ๋ถ€๋ค ์ดํ‚น์ด ๋๋Š”์ง€ ์›์ธ์ด ๋˜๋Š” ์š”์†Œ๋ฅผ ์ฐพ์•„์ค€๋‹ค. ๋ณด๋‹ˆ๊นŒ ๊ฐ ์นด๋“œ๋ทฐ์˜ height๋ฅผ ์žก์•„์ฃผ๋Š” ์˜คํ† ๋ ˆ์ด์•„์›ƒ๋•Œ๋ฌธ์— ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋‹ค๊ณ  ์›์ธ์„ ํŒŒ์•…ํ–ˆ๋‹ค.: ๋†’์ด๋ฅผ ์žก์•„์ฃผ์ง€ ์•Š์œผ๋ฉด ์—๋Ÿฌ๊ฐ€ ๋‚ ๊ฑฐ๊ฐ™์•˜๋Š”๋ฐ bottom๊นŒ์ง€ ์žก์€ ์ƒํƒœ์—ฌ์„œ ์—๋Ÿฌ๊ฐ€ ์•ˆ๋‚จ. ์Šคํƒ๋ทฐ๋Š” ๋‚ด๋ถ€์—์„œ๋ถ€ํ„ฐ ์˜คํ† ๋ ˆ์ด์•„์›ƒ์„ ์žก์•„์„œ ์Šˆํผ๋ทฐ์˜ ํฌ๊ธฐ๋ฅผ ์žก๋Š”๋‹ค๊ณ  ์•Œ๊ณ ์žˆ์—ˆ๋Š”๋ฐ, ์ด ๋•Œ๋ฌธ์— ๋†’์ด๋ฅผ ์žก์•„์•ผ ํ•˜๋Š” ์ค„ ์•Œ์•˜๋Š”๋ฐ ์•„๋‹ˆ์—ˆ๋‹ค!

  • Custom UISlider Delegate๋งŒ๋“ค๊ธฐ: ๋ญ”๊ฐ€ ๋‹น์—ฐํžˆ ์žˆ์„ ์ค„ ์•Œ์•˜๋˜ UISliderDelegate๊ฐ€ ์—†๋‹ค..(๋‹นํ™ฉ)
    • ๋‚œ ๊ธฐ๋ณธ ์Šฌ๋ผ์ด๋”๋ฅผ ์Šคํ† ๋ฆฌ๋ณด๋“œ์— addํ•˜๊ณ  IBAction์„ ์—ฐ๊ฒฐํ•ด์„œ ์“ธ ์ˆ˜ ์—†๋Š”๋ฐใ… ใ…  ์ปค์Šคํ…€ ํ•œ ๋‹ค๋ฅธ UISlider๊ฐ€ ์žˆ๋Š”๋ฐ..ใ… ใ… 
    • ๋‹นํ™ฉํ•˜์ง€ ์•Š๊ณ  ์ปค์Šคํ…€ ๋ธ๋ฆฌ๊ฒŒ์ดํŠธ๊นŒ์ง€ ๋งŒ๋“ค์–ด๋ณด๊ธฐ๋กœ ํ–ˆ๋‹ค!
  • UIView.animateํ•จ์ˆ˜๋กœ ์˜คํ† ๋ ˆ์ด์•„์›ƒ constraint๊ฐ’์„ ๋ฐ”๊ฟ”์ฃผ๊ณ ์‹ถ์€๋ฐ ์›€์ง์ž„์ด ์•„๋‹ˆ๋ผ ๋ฟ…ํ•˜๊ณ  ๋ฐ”๋€Œ๋Š”๊ฑฐ๊ฐ™์•„์„œ ์ฐพ์•„๋ณด๋‹ˆ๊นŒ ์ด๋Ÿฐ ์ด์œ ๊ฐ€โ€ฆ.
    • https://stackoverflow.com/a/25650669/10265697

TIL_2019_05

|

2019.05.12

  • ๋„ค์ด๋ฒ„์ง€๋„์—์„œ map์˜ userlocation์„ ๋ฐ›์•„์˜ฌ๋•Œ Doubleํ˜•์ธ๋ฐ, ์†Œ์ˆ˜์  ์ž๋ฆฌ๊ฐ€ 14์ž๋ฆฌ๊นŒ์ง€ ๋‚˜์˜ค๊ณ  ๋ฏธ์„ธํ•˜๊ฒŒ ์กฐ๊ธˆ์”ฉ ์ขŒํ‘œ๊ฐ€ ๊ณ„์† ๋ณ€ํ™”ํ•ด์„œ ์ขŒํ‘œ ๋ณ€ํ™”๋•Œ๋งˆ๋‹ค ์ฃผ๋ณ€๋งˆํŠธ ์œ„์น˜๋ฅผ fetchํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜๋Š”๊ฑด ๋„ˆ๋ฌด ๋‚ญ๋น„๋ผ๊ณ  ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค.
  • ์ฒ˜์Œ์— ๋ทฐ๊ฐ€ ๋œฐ๋•Œ ์ด๋ฏธ ์œ„์น˜ ํŠธ๋ž™ํ‚น ์ƒํƒœ์ด๊ณ  ์œ„์น˜๊ฐ€ ๊ฐ์ง€๋˜์ž๋งˆ์ž ์ตœ์†Œ ๊ฒ€์ƒ‰๋‹จ์œ„ 2km๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋„๋ก ๋งŒ๋“ค๋ ค๊ณ ํ–ˆ๋Š”๋ฐ, ํŽธํ•˜๊ฒŒ ๋งŒ๋“ค๋ ค๋ฉด ๊ทธ๋ƒฅ ์‚ฌ์šฉ์ž๊ฐ€ ํ•œ๋ฒˆ ๋ฒ„ํŠผ์„ ๋ˆŒ๋ €์„๋•Œ fetch๋˜๊ฒŒ ํ•˜๋ฉด ๋์ง€๋งŒ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์•˜๋‹ค.
  • ์ง€๋„์—์„œ ์ฐพ์•„๋ณด๋‹ˆ ๋„ค์ด๋ฒ„์ง€๋„๊ฐ€ ๋ฆฌํ„ดํ•œ ์ขŒํ‘œ์˜ ์†Œ์ˆ˜์  ๋„ท์งธ์ž๋ฆฌ๊นŒ์ง€๋งŒ ์ฐ์–ด๋ด๋„ ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ์ •ํ™•๋„๋งŒํผ์˜ ์œ„์น˜๊ฐ€ ๋‚˜์™”๋‹ค.
  • ๊ทธ๋ฆฌ๊ณ  ๋ฏธ์„ธํ•˜๊ฒŒ ๋ณ€ํ™”ํ•˜๋Š” ์œ„์น˜๋„ ๋„ท์งธ์ž๋ฆฌ ์ดํ›„์˜ ์ž๋ฆฟ์ˆ˜์ž„์„ ํ™•์ธ.
  • ์‚ฌ์šฉ์ž ์œ„์น˜๋ฅผ ํŒ๋ณ„ํ• ๋•Œ ๋„ท์งธ์ž๋ฆฌ ์ดํ›„๋กœ ๋ฒ„๋ฆผํ•œ ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ํŒ๋ณ„ํ•˜๊ณ , ํ˜„์žฌ ํƒ์ƒ‰ํ•ด์„œ ๋ฆฌํ„ดํ•œ ์ขŒํ‘œ ๊ฐ’์ด ํ˜„์žฌ ๋ทฐ์ปจํŠธ๋กค๋Ÿฌ์— ์ €์žฅ๋œ ์ขŒํ‘œ๊ฐ’๊ณผ ์ฐจ์ด๊ฐ€ ํฌ๊ฒŒ ๋‚˜์ง€ ์•Š๋Š”์ด์ƒ ์ƒˆ ์ขŒํ‘œ๋ฅผ ๋ณ€์ˆ˜์— ๋Œ€์ž…ํ•˜์ง€ ์•Š๋Š” ๋ฐฉ์‹์œผ๋กœ ๋กœ์ง์„ ๊ตฌํ˜„ํ•˜๋„๋ก ์ƒ๊ฐํ–ˆ๋‹ค.
  • Double ์†Œ์ˆ˜์  ๋ฒ„๋ฆฌ๊ธฐ

2019.05.13

  • ์˜ค๋Š˜๋„ ๋Œ€์ฐจ๊ฒŒ ๊นŒ์ด๋ฉด์„œ ์–ป์€ ์ง€์‹๋“คโ€ฆใ…Ž
  • cornerRadius๊ฐ€ ์ ์šฉ๋œ ๋ทฐ๋Š” ๊ทธ๋ฆผ์ž๋ฅผ ๋ฐ”๋กœ ์ ์šฉํ•  ์ˆ˜ ์—†๋‹ค. clipToBounds์†์„ฑ๋•Œ๋ฌธ์—!
  • outerView๋ฅผ ๋งŒ๋“ค์–ด์„œ ๊ทธ๋ฆผ์ž๋ฅผ ์ ์šฉ. ๋ผ์šด๋”ฉ ๋ชจ์„œ๋ฆฌ๊ฐ€ ์ ์šฉ๋œ ๋ทฐ๋ฅผ outerView์— ์„œ๋ธŒ๋ทฐ๋กœ ์ถ”๊ฐ€
  • UIBezierPath๋ฅผ ์ด์šฉํ•ด์„œ CGpath๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ๋ฆผ์ž๋ฅผ ์ ์šฉํ•œ๋‹ค.
  • DesignableView๋Š” attribute inspector์—์„œ ๊ทธ๋ฆผ์ž์™€ cornerRadius๋ฅผ ๋™์‹œ์— ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋Œ€์‹ ์— clipToBounds ์†์„ฑ์„ true๋กœ ๋ฐ”๊พธ๋ฉด ๊ทธ๋ฆผ์ž ์—†์–ด์ง.. ๋ญ”๊ฐ€ ํ—ท๊ฐˆ๋ฆฌ๊ฒŒ ๋˜์–ด์žˆ์Œ ใ… 

2019.05.17

  • computed property setter

2019.06.15

  • Martholiday: ์ž˜๋˜๋˜ ๋งต๋ทฐ๊ฐ€ ๋ฐœ๋“ฑ์ฐ์€๋‚ ..
  • didSet์œผ๋กœ ํ˜„์žฌ์œ„์น˜๊ฐ€ ์ฐํžˆ๋ฉด ๋ฐ”๋กœ ์ฃผ๋ณ€๋งˆํŠธ์ •๋ณด๋ฅผ ์š”์ฒญํ•˜๋Š” API๋ฅผ ๋ณด๋‚ด๋Š” fetch๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ฒŒ ํ•ด๋†จ๋Š”๋ฐ, ๋„ค์ด๋ฒ„์ง€๋„๋Š” ์œ„์น˜ํƒ์ƒ‰ ํ˜ธ์ถœ์„ ์ง€์†์ ์œผ๋กœํ•œ๋‹ค. ๋”ฐ๋ผ์„œ didSet ํ”„๋กœํผํ‹ฐ๋Š” ์ง€์†์ ์œผ๋กœ ๋ฐ”๋€Œ๊ณ , ๋น„๋™๊ธฐ ์ฝœ๋ฐฑ์ด ์‹คํ–‰๋ ๋•Œ๋งˆ๋‹ค ๋น„๋™๊ธฐ๋™์ž‘์ด ๊ต์ฐจ์ ์œผ๋กœ ๊ณ„์† ์ผ์–ด๋‚˜๋Š”๋ฐ, ๋น„๋™๊ธฐ๋กœ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‹คํ–‰ํ•˜๋Š” fetchํ•จ์ˆ˜์— ๋„˜๊ธด handler๋ฅผ main thread์—์„œ ์‹คํ–‰์‹œ์ผœ์ฃผ์ง€ ์•Š์•„์„œ ๊ณ„์† ์—๋Ÿฌ๊ฐ€ ๋‚ฌ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ํฌ๋ž˜์‹œ๊ฐ€ ๋‚˜๋ฉด์„œ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€์—๋Š” ๋ฉ”์ธ์“ฐ๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜์–ด์•ผ ํ•  ๋™์ž‘์ด ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜์—ˆ๋‹ค๋Š” ๋ฉ”์‹œ์ง€๊ฐ€ ๊ณ„์† ๋‚˜์™”์Œ.
  • ๊ทธ๋™์•ˆ ์ด๋Ÿฐ ํฌ๋ž˜์‹œ๊ฐ€ ๋ช‡ ๋ฒˆ ๋ฐœ์ƒํ–ˆ๋Š”๋ฐ, fetch๊ฐ€ ์‹œ์ž‘๋˜๋ฉด notification์„ ๋ณด๋‚ด์„œ ํ˜„์žฌ ์œ ์ €์œ„์น˜๋ฅผ ๊ทธ๋งŒ ํƒ์ƒ‰ํ•˜๋„๋ก flag์—ญํ• ์„ ํ•ด์คฌ์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•œ๋‘๋ฒˆ ์žฌ๋นŒ๋“œํ•ด๋ณด๋ฉด ์•ฑ์ด ์‹คํ–‰๋์–ด์„œ ๊ฐ„๊ณผํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋•Œ๋Š” ์„œ๋ฒ„ ์ƒํ™ฉ๊ณผ ๋‚ด ์ƒํ™ฉ์ด ๋ญ”๊ฐ€ ํƒ€์ด๋ฐ์ด ๋งž์•„์„œ ๋„˜์–ด๊ฐ”๋‚˜๋ณธ๋ฐ, ์˜ค๋Š˜์€ ๊ณ„์†ํ•ด์„œ ํฌ๋ž˜์‹œ๊ฐ€ ๋‚˜์„œ breakpoint์ฐ์–ด๋ณด๊ณ  ์ผ๋‹จ์€ ํ•ด๊ฒฐํ–ˆ๋‹ค.
  • ์˜ค๋Š˜์˜ ๋ชฉํ‘œ!
    • ๋งต๋ทฐ์—์„œ ๋งˆ์ปค์— ํ˜„์žฌ ๋งˆ์ปค์˜ ๋งˆํŠธ๊ฐ„๋‹จ์ •๋ณด ํ‘œ์‹œ(์ฆ์ฐพ/์ด๋ฆ„/์ฒซ๋ฒˆ์งธํœด๋ฌด์ผ)ํ•˜๊ณ  ๋ˆ„๋ฅด๋ฉด ๋งˆํŠธ ์ƒ์„ธํ™”๋ฉด์œผ๋กœ ๋“ค์–ด๊ฐ€๋Š”๊ฒƒ๊นŒ์ง€ ํ•„์ˆ˜๊ตฌํ˜„
    • ์‹œ๊ฐ„์ด ๋˜๋ฉด ์ปค์Šคํ…€ ์Šฌ๋ผ์ด๋” ๊ตฌํ˜„

TIL_2019_04

|

2019.04.11

  • ์Šคํฌ๋กค๋ทฐ์˜ contentOffSet์€ ์‹œ์ž‘์ ์ด 0!! ๊ทธ๋ž˜์„œ ๊ฐ€๋กœ ํŽ˜์ด์ง•์‹œ ๋งจ ๋์œผ๋กœ ๊ฐ€๋„ scrollview.contentsize.width๊ฐ’์ด ๋˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ๋งจ ๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€์˜ ์‹œ์ž‘์ ! ์ด๋ฏ€๋กœ
  • ๊ฐ€๋กœํŽ˜์ด์ง•์‹œ ๋งˆ์ง€๋ง‰ ํŽ˜์ด์ง€์˜ contentOffset.x๋Š” scrollview.contentsize.width - screenheight์œผ๋กœ ๊ตฌํ•ด์•ผํ•œ๋‹ค.
  • ์ฐธ๊ณ 

2019.04.16

  • pod install์„ ํ–ˆ๋”๋‹ˆ ๊ฑด๋“ค์ง€๋„ ์•Š์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ swift๋ฒ„์ „์ด ์˜ฌ๋ผ๊ฐ€๋ฒ„๋ฆผ..
  • ์‹ฌ์ง€์–ด ํ•˜๋‚˜๋งŒ ์„ค์น˜ํ•˜๋Š” ๋ช…๋ น์–ด ์ฐพ์•„์„œ ํ–ˆ๋Š”๋ฐ๋„ (pod install --no-repo-update ์ด๊ฑด๋ฐ ์‚ฌ์‹ค ์ด๊ฑด ํ•„์š”๊ฐ€ ์—†์—ˆ๋‹ค pod install ๋ช…๋ น์–ด ์ž์ฒด๊ฐ€ ์ƒˆ๋กœ ์ถ”๊ฐ€๋œ pod๋งŒ ์„ค์น˜๋˜๋Š” ๋ช…๋ น์–ด์˜€์Œ. ์œ„์˜ ์ € ๋ช…๋ น์–ด๋Š” ์ฝ”์ฝ”์•„ํŒŸ repo์— ์ƒˆ๋กœ์šด ๋ฒ„์ „์ด ์žˆ์–ด๋„ update ์•ˆํ•˜๊ณ  pod์„ ์„ค์น˜ํ•œ๋‹ค๋Š” ๋ช…๋ น์–ด - ๊ด€๋ จ๋งํฌ)
  • ์•„๋ฌดํŠผ pod install์„ ํ•˜๋‹ˆ๊นŒ podfile์—์„œ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š์€ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ, ๋ฌธ๋ฒ• deprecated ์—๋Ÿฌ๋ฅผ ๋ง‰ ๋ฑ‰์œผ๋ฉด์„œ ๋นŒ๋“œ๊ฐ€ ์•ˆ๋๋‹ค.
  • ์•Œ์•„๋ณด๋‹ˆ pod install์„ ํ•˜๋ฉด ๋ณ€ํ™”๊ฐ€ ์—†์–ด์•ผํ•˜๋Š” pod์—๋„ ๋ณ€ํ™”๊ฐ€ ์ผ์–ด๋‚˜์„œ swift๋ฒ„์ „์ด ์˜ฌ๋ผ๊ฐ€๊ฑฐ๋‚˜ ํ•˜๋Š” ๋นŒ๋“œ์„ธํŒ…์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธด๋‹ค๊ณ  ํ•œ๋‹ค.
  • ํ•ด๊ฒฐ: ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋นŒ๋“œ์„ธํŒ…์—์„œ (Pods๋นŒ๋“œ์„ธํŒ… ๋ฉ”๋‰ด์—์„œ ์™ผ์ชฝ target์—์„œ ์„ ํƒํ•˜๋ฉด๋จ) ํ™•์ธํ•ด๋ณด๋‹ˆ swift๋ฒ„์ „์ด 5๋กœ ๋˜์–ด์žˆ์—ˆ๋‹คโ€ฆ(๋Œ€์ฒด์™œ..)์ด๊ฑธ Swift4๋กœ ๋‚ด๋ ค์ฃผ๋‹ˆ๊นŒ ์ž˜๋จ! - ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด ๋ฒ„์ „์€ swift5๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š”๋ฐ ๋นŒ๋“œ์„ธํŒ…์ด 5๋กœ ๋˜์–ด์žˆ์–ด์„œ deprecated์—๋Ÿฌ๋„ ๋‚˜๊ณ  ๋นŒ๋“œ๊ฐ€ ์•ˆ๋๋˜๊ฒƒ.

2019.04.17

  • ์ผํ• ๋•Œ ๊นƒํฌ๋ผ์ผ„ ์จ์„œ ์ž๊พธ git CLI๋ช…๋ น์–ด๋ฅผ ๊นŒ๋จน๋Š”๋‹ค..์ง‘์ฝ”ํ• ๋•Œ๋Š” ์ตœ๋Œ€ํ•œ ํ„ฐ๋ฏธ๋„๋กœ ํ•˜๋ ค๊ณ ํ•˜๋Š”๋ฐ stashํ•˜๊ณ  ์ง€์šธ์ผ์ด ์ƒ๊ฒผ๋Š”๋ฐ stash ๋ช…๋ น์–ด๋Š” ์ž˜ ์•ˆ์จ๋ด์„œ ์‚ฌ์šฉํ–ˆ๋˜ ๊ฒƒ ์ •๋ฆฌํ•จ.
  • git stash list: stash ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ด„
  • git stash show -p: ๊ฐ€์žฅ ์ตœ๊ทผ์˜ stash์˜ ๋‚ด์šฉ์„ ๋ด„
  • git stash show -p stash@{1}: {i} i๋ฒˆ์งธ์˜ stash ๋‚ด์šฉ์„ ๋ด„
  • git stash drop stash@{0}: {i} i๋ฒˆ์งธ์˜ stash๋ฅผ ์ง€์›€

2019.04.20

  • ์›๋ž˜ ์ด๋ฒˆ์ฃผ ๋ชฉ์š”์ผ์ธ๊ฐ€ ๊ธˆ์š”์ผ์— ๋งˆํŠธ์‰ฌ๋Š”๋‚  1.4์‹ฌ์‚ฌ์š”์ฒญํ•˜๋ ค๊ณ ํ–ˆ๋Š”๋ฐ ๋…ธ์น˜๋””์Šคํ”Œ๋ ˆ์ด ์Šคํฌ๋ฆฐ์ƒท ์—…๋กœ๋“œ๊ฐ€ ํ•„์ˆ˜๊ฐ€ ๋˜์–ด๋ฒ„๋ ค์„œ ์—…๋กœ๋“œ๋ฅผ ๋ชปํ–ˆ๋‹ค..๋””์ž์ธํˆด๊ฐ™์€๊ฒŒ ํ•˜๋‚˜๋„ ์—†์–ด์„œ ์ €๋ฒˆ์— ์•ฑ์Šคํ† ์–ด ์ฒ˜์Œ ์˜ฌ๋ฆด๋•Œ ๊ณ ์ƒํ–ˆ๋˜๊ฑฐ ์ƒ๊ฐํ•˜๋ฉดโ€ฆ๊ทธ ํ•˜๊ธฐ์‹ซ์–ด์ ธ์„œ ๋ฏธ๋ค˜๋Š”๋ฐ ์˜ค๋Š˜ ํ•ด์•ผํ•จ.
  • ๊ทธ๋ž˜์„œ ์•ฑ์Šคํ† ์–ด ์Šคํฌ๋ฆฐ์ƒท ๋งŒ๋“ค์–ด์ฃผ๋Š” ํˆด์„ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•œ๋‹ค. ์œ ๋ฃŒ์—ฌ๋„์จ์•ผ์ง€..Best 12 tools to create amazing screenshots for your mobile apps (2018)

Gitrebase

|