์ „์ฒด ๊ธ€

์ „์ฒด ๊ธ€

    ํ™๋ณด๋Š” ๋ˆ„๊ตฌ์—๊ฒŒ ํ•ด์•ผ ํ•˜๋Š” ๊ฑธ๊นŒ?

    ๋‹ค์‹œ ๋ถ€์ŠคํŠธ์บ ํ”„ ์›น·๋ชจ๋ฐ”์ผ์˜ ๊ต์œก์ƒ์„ ๋ชจ์ง‘ํ•˜๋Š” ์‹œ์ฆŒ์ด ๋Œ์•„์™”๋‹ค.์š”์ƒˆ ์ผ์„ ํ•˜๋Š” ์‹œ๊ฐ„ ์ค‘ 80%๋Š” ๊ณ ๋‡Œ์˜ ์‹œ๊ฐ„์œผ๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒ ๊ฐ™๋‹ค..^^ ํ™๋ณด ์—…๋ฌด๋ฅผ ๋‹ด๋‹นํ•˜๋ฉฐ ํ–ˆ๋˜ ์ด๋Ÿฐ์ €๋Ÿฐ ์ƒ๊ฐ์„ ์ž‘์„ฑํ•ด ๋ณธ๋‹ค. ์–ด๋–ค ํ™๋ณด๋ฌผ์—์„œ๋“  ์ด๊ฒƒ์ด ์—ฌ๋Ÿฌ๋ถ„์—๊ฒŒ ํšจ๊ณผ์ ์ด๋ผ๊ณ  ๋งํ•œ๋‹ค. ํŠนํžˆ ๋ช…ํ™•ํ•œ ์•„์›ƒํ’‹์„ ๊ฐ•์กฐํ•˜๋ฉด์„œ. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์ด์–ดํŠธ ์ œํ’ˆ ๊ด‘๊ณ ๋Š” '์ผ์ฃผ์ผ ๋งŒ์— 5kg ๊ฐ๋Ÿ‰!!!' ์ด๋ผ๋“ ๊ฐ€, ์–ด๋– ํ•œ ์ž๊ธฐ๊ณ„๋ฐœ์„œ์˜ ๊ด‘๊ณ ๋Š” '์ด ์ฑ…์„ ์ฝ์œผ๋ฉด ๋‹น์‹ ์˜ ์ธ์ƒ์ด ๋ณ€ํ•ฉ๋‹ˆ๋‹ค' ๋ผ๋“ ๊ฐ€.. ์ด๋Ÿฐ ์•„์›ƒํ’‹์„ ๋ณด๋ฉด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•ด๋‹น ํšจ๊ณผ๊ฐ€ ์ ์šฉ๋œ ๋‚ด ๋ชจ์Šต์„ ์ƒ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ์‚ฌ๋žŒ์— ๋”ฐ๋ผ์„œ๋Š” 5kg ๊ฐ๋Ÿ‰์ด ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๊ณ , ๋”ฑํžˆ ์ธ์ƒ์˜ ๋ณ€ํ™”๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋Ÿฐ ๊ฒฝ์šฐ๋Š” ๋ณธ์ธ์ด ๋ญ˜ ์›ํ•˜๋Š”์ง€ ๋ช…ํ™•ํžˆ ์•„๋Š” ๊ฒƒ ๊ฐ™๋‹ค. ๋ถ„๋ช… ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์‡ผํ•‘ํ•  ๋•Œ ๊ฒ€์ƒ‰..

    [iOS] Firebase Cloud Messaging - APN

    ๊ธฐ๋ก์šฉ 1. firebase project ๋งŒ๋“ค๊ธฐ https://console.firebase.google.com/u/3/?hl=ko 2. iOS ์•ฑ ์ถ”๊ฐ€ํ•˜๊ธฐ iOS๋ฅผ ๋ˆŒ๋Ÿฌ ์•ฑ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค ๊ทธ๋Ÿฌ๋ฉด ์•ฑ ๋“ฑ๋ก ํ™”๋ฉด์ด ๋‚˜์˜ค๋Š”๋ฐ ์ด๋•Œ Apple ๋ฒˆ๋“ค ID๋ฅผ ์ž…๋ ฅํ•ด์•ผ ํ•จ ์š”๊ฑด ์–ด๋Š ๊ฒƒ์ด๋ƒ๋ฉด ์˜ค๋ฅธ์ชฝ ์—‘์Šค์ฝ”๋“œ ์ฐฝ์—์„œ!! Signing & Capabilities ์•ˆ์— ์žˆ๋Š” Bundle Identifier ์ž…๋‹ˆ๋‹ค ๋‚˜๋จธ์ง€ ์•ฑ ๋‹‰๋„ค์ž„, App Store ID๋Š” ์„ ํƒ์‚ฌํ•ญ์ด๋‹ˆ ํŒจ์Šคํ• ๊ฒŒ์š” ๊ทธ๋Ÿฌ๋ฉด 2๋ฒˆ ๋‹จ๊ณ„ ๊ตฌ์„ฑ ํŒŒ์ผ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ๋‚˜์˜ค๊ณ , GoogleService-Info.plist ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„์„œ Xcode ํ”„๋กœ์ ํŠธ ์•ˆ์— ์ถ”๊ฐ€ํ•ด ์ฃผ์„ธ์š” ์ €๋Š” ์œ„ ์‚ฌ์ง„์ฒ˜๋Ÿผ Plists๋ผ๋Š” ํด๋”๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด ์—ฌ๊ธฐ์— Info.plist์™€ ํ•จ๊ป˜ ๋„ฃ์–ด ๋‘..

    [UIKit] UIScrollView "Scrollable content size is ambiguous." ์—๋Ÿฌ ํ•ด๊ฒฐ

    ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ ์š”์ƒํ•˜๊ฒŒ ๊ตฌํ˜„ํ–ˆ์—ˆ๋Š”๋ฐ... ์กฐ์ž‘ํ•˜๋Š” ๋ฐ๋‚˜ ๋ณด์—ฌ์ง€๋Š” ๋ทฐ์—์„œ๋Š” ์•„๋ฌด ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ์ง€๋งŒ, View Hierarchy๋ฅผ ๋ณด๋ฉด ์ œ์•ฝ์กฐ๊ฑด ์—๋Ÿฌ๊ฐ€ ์žˆ๋Š” ๊ฒŒ ๋„ˆ๋ฌด๋„ˆ๋ฌด ๊ฑฐ์Šฌ๋ ค์„œ ๊ฒฐ๊ตญ ํ•ด๊ฒฐํ–ˆ๋‹ค! (ํ‰์†Œ scrollView ์—๋Ÿฌ๋Š” ํ„ฐ์น˜๋‚˜ ์Šคํฌ๋กค์ด ์•ˆ ๋˜๋Š” ๋“ฑ์˜ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ์ง€๋งŒ, ์ด ๊ฒฝ์šฐ๋Š” ๋ชจ๋“  ์ธํ„ฐ๋ž™์…˜์ด ๋‹ค ๊ฐ€๋Šฅํ•˜๊ธด ํ–ˆ์Œ.) ์›๋ž˜ ์ฝ”๋“œ (SnapKit ์‚ฌ์šฉ) self.view.addSubviews([scrollView]) self.scrollView.addSubview(contentView) self.contentView.addSubviews([infoTitleLabel, profileInfoView, tagTitleLabel, tagCollectionView, emailTitleLabel, emailButto..

    2021๋…„ ํšŒ๊ณ , 2022๋…„์˜ ๋‹ค์ง

    ๋ฒŒ์จ 2021๋…„์ด ๋งˆ๋ฌด๋ฆฌ๋˜๊ณ  ์žˆ๋‹ค. ๋ช‡ ์‹œ๊ฐ„ ์•ˆ ๋‚จ์•˜์ง€๋งŒ... ๋ฐค์ƒˆ์›Œ์„œ ์ ์„ ์ˆ˜ ์žˆ๊ฒ ์ง€. ์ž‘๋…„์€ ์ฝ”๋กœ๋‚˜๊ฐ€ ์ด์ œ ๋ง‰ ์‹œ์ž‘๋˜๋˜ ์‹œ๊ธฐ๋ผ ์ •์‹  ๋ชป ์ฐจ๋ฆฌ๊ณ  ๋ณด๋ƒˆ์—ˆ๋‹ค. ๊ฟ€ ๋นจ๋ฉด์„œ ํ•™๊ต ๋‹ค๋‹ˆ๋ฉฐ... ์•Œ๋ฐ” ์—ด์‹ฌํžˆ ํ–ˆ๋‹ค. ์˜ฌํ•ด๋Š” '๋„์ „์˜ ํ•ด'๋ผ๊ณ  ์ •์˜ํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค. ์ฒ˜์Œ ๊ฒช๋Š” ์ผ๋“ค์ด ๋„ˆ๋ฌด ๋งŽ์•˜๋‹ค. ๊ทธ๋ฆฌ๊ณ ... ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ์ผ๋“ค๋„ ๋งŽ์•˜๋‹ค. J ์ค‘์—์„œ๋„ ๊ทน์„ฑ J๋ผ๋Š” ESTJ์ธ ๋‚˜๋Š”... ๊ณ„ํšํ•˜์ง€ ์•Š์•˜๋˜ ์ผ์„ ๋งˆ์ฃผ์น˜๊ฒŒ ๋˜๋ฉด ์ข€ ์–ด๋ฆฌ๋ฐ”๋ฆฌํ•ด์ง„๋‹ค. ์˜ฌํ•ด๋ฅผ ๋ณด๋‚ด๊ณ  ๋‚˜๋‹ˆ๊นŒ ๊ทธ๋Ÿฐ ์ƒํ™ฉ์—์„œ๋„ ์กฐ๊ธˆ์ด๋‚˜๋งˆ ๋” ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์ฒ˜ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ๋œ ๊ฒƒ ๊ฐ™๋‹ค. # ๋ณต์ˆ˜์ „๊ณต ์˜ฌํ•ด์˜ ์ฒซ ๋„์ „, ๋ณต์ˆ˜์ „๊ณต. ๋ณต์ˆ˜์ „๊ณต์„ ์‹ ์ฒญํ•˜๊ธฐ์—” ์„ฑ์ ์ด ์ข€ ๋”ธ๋ฆฌ๋˜ ๋‚˜๋Š” ๋น„๋Œ€๋ฉด ์ˆ˜์—…์„ ๋ฐœํŒ ์‚ผ์•„ ์„ฑ์ ์„ ์—ด์‹ฌํžˆ ์˜ฌ๋ ธ๋‹ค. ๊ฐ„์‹ ํžˆ ์ปคํŠธ๋ผ์ธ ๋งž์ถฐ์„œ ๋ณต์ˆ˜์ „๊ณต ์‹ ์ฒญ์„ ํ•ด๋ƒˆ๋‹ค. ๋‹จ์ˆœํžˆ..

    [RxSwift] ARC, ๊ฐ•ํ•œ ์ฐธ์กฐ strong, ์•ฝํ•œ ์ฐธ์กฐ weak, ๊ฐ•ํ•œ ์ฐธ์กฐ ์ˆœํ™˜ ๋ฌธ์ œ

    Struct vs Class Struct ํƒ€์ž…๊ณผ Class ํƒ€์ž…์„ ๋น„๊ตํ•  ๋•Œ ๊ฐ€์žฅ ๋งŽ์ด ํ•˜๋Š” ๋ง → Struct๋Š” ๊ฐ’ ํƒ€์ž…, Class๋Š” ์ฐธ์กฐ ํƒ€์ž…! ๊ฐ’ ํƒ€์ž…: ์ „๋‹ฌํ•  ๋•Œ๋งˆ๋‹ค ๊ฐ’์„ ๋ณต์‚ฌํ•ด์„œ ์ „๋‹ฌ ์ฐธ์กฐ ํƒ€์ž…: ํ•˜๋‚˜์˜ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ์ ‘๊ทผ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ ์ ˆํ•œ ์‹œ์ ์— ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํ•ด์ œ๋˜์ง€ ์•Š์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ์ž์›์„ ๋‚ญ๋น„ํ•˜๊ฒŒ ๋จ. → ์Šค์œ„ํ”„ํŠธ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ARC๋ฅผ ์‚ฌ์šฉ! ARC์˜ ์ž‘๋™ ๊ทœ์น™์„ ๋ชจ๋ฅด๊ณ  ์‚ฌ์šฉํ•˜๋ฉด ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์˜์›ํžˆ ํ•ด์ œ๋˜์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—... ARC์— ๋Œ€ํ•ด ์•Œ์•„์•ผ ํ•œ๋‹ค. ARC * ์ž๋™ ์ฐธ์กฐ ์นด์šดํŒ…, Automatic Reference Counting => ์ž๋™์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ด€๋ฆฌํ•ด ์ฃผ๋Š” ๋ฐฉ์‹ * ๋” ์ด์ƒ ํ•„์š”ํ•˜์ง€ ์•Š์€ ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ..

    [RxSwift] Subject, .scan, RxCocoa, .bind ๊ฐœ๋…

    ๊ณฐํŠ€๊น€ ๋‹˜์˜ RxSwift 4์‹œ๊ฐ„์— ๋๋‚ด๊ธฐ (์ข…ํ•ฉํŽธ) ์˜์ƒ์„ ๋ณด๊ณ  ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค ^~^ https://youtu.be/w5Qmie-GbiA ์ •๋ง ์ƒ์ดˆ๋ณด,, ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅด๋Š” ์ž…์žฅ์—์„œ ๊ฐ•์˜ ์˜์ƒ์„ ๋ณด๊ณ  ์˜์‹์˜ ํ๋ฆ„๋Œ€๋กœ ์ž‘์„ฑํ•œ ๊ธ€์ด๋‹ˆ ๋น„ํŒ์˜ ๋ˆˆ์œผ๋กœ ๊ธ€์„ ์ฝ์–ด ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค~~ ์˜ค๋ฅ˜ ์ง€์  ๋Œ€ํ™˜์˜! Subject Observable ๋ฐ–์—์„œ ๊ฐ’์„ ๋ฐ›์•„ ์™€์„œ ์ปจํŠธ๋กคํ•  ์ˆ˜ ์žˆ์Œ ์ข…๋ฅ˜ 4๊ฐœ(docs ์ฐธ๊ณ ) AsyncSubject Subcribe๊ฐ€ ์•„๋ฌด๋ฆฌ ๋งŽ์ด ๋“ค์–ด์™€๋„ Complete ์‹œ์ ์— ๊ฐ€์žฅ ๋งˆ์ง€๋ง‰ ๋ฐ์ดํ„ฐ๋งŒ ๋ชจ๋‘์—๊ฒŒ ๋‚ด๋ ค ์คŒ BehaviorSubject ๊ธฐ๋ณธ๊ฐ’ ํ•˜๋‚˜ ๊ฐ€์ง€๊ณ  ์‹œ์ž‘, ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ Subscribeํ•˜๋ฉด ๊ธฐ๋ณธ๊ฐ’์„ ๋‚ด๋ ค ์คŒ ์ค‘๊ฐ„์— ์ƒˆ๋กญ๊ฒŒ Subscirbe๊ฐ€ ๋“ค์–ด์˜ค๋ฉด ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๊ฐ€์žฅ ์ตœ๊ทผ์˜ ๊ฐ’์„ ๋‚ด๋ ค ์คŒ ..

    [RxSwift] Observable์˜ ์ƒ๋ช… ์ฃผ๊ธฐ, ์ˆœํ™˜ ์ฐธ์กฐ์™€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ, subscribeOn, observeOn

    ์ •๋ง ์ƒ์ดˆ๋ณด,, ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅด๋Š” ์ž…์žฅ์—์„œ ๊ฐ•์˜ ์˜์ƒ์„ ๋ณด๊ณ  ์˜์‹์˜ ํ๋ฆ„๋Œ€๋กœ ์ž‘์„ฑํ•œ ๊ธ€์ด๋‹ˆ ๋น„ํŒ์˜ ๋ˆˆ์œผ๋กœ ๊ธ€์„ ์ฝ์–ด ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค~~ ์˜ค๋ฅ˜ ์ง€์  ๋Œ€ํ™˜์˜! Observable Life-Cycle 1. Create Observable ์ƒ์„ฑ ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ์„ฑ๋˜๊ฑฐ๋‚˜, ์–ด๋–ค ๋ช…๋ น์ด ๋™์ž‘ํ•˜์ง€ ์•Š์Œ → 2. Subscribe์—์„œ ๋™์ž‘! 2. Subscribe ์–ด๋– ํ•œ Observable์ด ๋™์ž‘ํ•จ 3. Next ๋ฐ์ดํ„ฐ ์ „๋‹ฌ 4. Completed ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ ๋ 4-1. Error ๋น„์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ ๋ 5. Disposed Dispose๋˜๋ฉด ๊ทธ Observable์€ ๋” ์ด์ƒ ์žฌ์‚ฌ์šฉ ๋ถˆ๊ฐ€ .debug() ๋กœ Observable ์ƒํƒœ ํ™•์ธ ๊ฐ€๋Šฅ ์ˆœํ™˜ ์ฐธ์กฐ์™€ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ .subscribe(onNext: { i in s..

    ๊ธฐํš์ž ์—†์ด ์„œ๋น„์Šค ๋งŒ๋“ค๊ธฐ - ๋ฒ„๊ทธ/์—…๋ฐ์ดํŠธ ๋ฆฌํฌํŠธ ํŽธ

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

    [RxSwift] ์ด๊ฒŒ ๋งž๋‚˜? ์‹ถ์€ RxSwift ๊ฐœ๋… ์ •๋ฆฌ

    ๊ณฐํŠ€๊น€ ๋‹˜์˜ RxSwift 4์‹œ๊ฐ„์— ๋๋‚ด๊ธฐ (์ข…ํ•ฉํŽธ) ์˜์ƒ์„ ๋ณด๊ณ  ์ž‘์„ฑํ•œ ๊ธ€์ž…๋‹ˆ๋‹ค ^~^ https://youtu.be/w5Qmie-GbiA ์ •๋ง ์ƒ์ดˆ๋ณด,, ์•„๋ฌด๊ฒƒ๋„ ๋ชจ๋ฅด๋Š” ์ž…์žฅ์—์„œ ๊ฐ•์˜ ์˜์ƒ์„ ๋ณด๊ณ  ์˜์‹์˜ ํ๋ฆ„๋Œ€๋กœ ์ž‘์„ฑํ•œ ๊ธ€์ด๋‹ˆ ๋น„ํŒ์˜ ๋ˆˆ์œผ๋กœ ๊ธ€์„ ์ฝ์–ด ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค~~ ์˜ค๋ฅ˜ ์ง€์  ๋Œ€ํ™˜์˜! [1๊ต์‹œ] ๊ฐœ๋…์žก๊ธฐ - RxSwift๋ฅผ ์‚ฌ์šฉํ•œ ๋น„๋™๊ธฐ ํ”„๋กœ๊ทธ๋ž˜๋ฐ โœˆ๏ธ Rx์˜ ๋ชฉ์  ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์ง€๋Š” ๋ฐ์ดํ„ฐ(์–ธ์ œ ๋งŒ๋“ค์–ด์งˆ์ง€ ๋ชจ๋ฆ„)๋ฅผ completion์œผ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ๋ฆฌํ„ด ๊ฐ’์œผ๋กœ ์ „๋‹ฌํ•˜์—ฌ ์ข€ ๋” ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋„๋ก ๋งŒ๋“ค์–ด์ง„ ์œ ํ‹ธ๋ฆฌํ‹ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ž‘์—… ๋„์ค‘ ์ทจ์†Œ ์‹œ ์œ ์šฉ ๋™๊ธฐ/๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ ์‰ฝ๊ณ  ๊ฐ„๋‹จํ•˜๊ฒŒ create, subscribe, disposable // MARK: RxSwift ์›ํ˜• ์‚ฌ์šฉ..

    [Swift] ํƒ€์ž…์บ์ŠคํŒ…, ๋‹ค์šด์บ์ŠคํŒ…, is, as๋ž€?

    Swift์˜ ํƒ€์ž…์บ์ŠคํŒ…์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์•„์š”. ๐Ÿ˜Ž ๋จผ์ € ํด๋ž˜์Šค์˜ ์ƒ์† ๊ฐœ๋…๋ถ€ํ„ฐ ์ดํ•ดํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•˜๋Š”๋ฐ...... ์ด๋ ‡๊ฒŒ Coffee, Latte, Americano๋ผ๋Š” ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ๋ผ๋–ผ์™€ ์•„๋ฉ”๋ฆฌ์นด๋…ธ๋ฅผ ๋ฌถ์–ด์„œ ์ปคํ”ผ๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ๋„ ํ•˜์ฃ !??!? ์ปคํ”ผ๋ผ๋Š” ๊ฐœ๋…์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ๋ผ๋–ผ๋Š”, ์—ฌ๊ธฐ์—์„œ๋Š” ์ปคํ”ผ๋ฅผ ์ƒ์†๋ฐ›์•„ ๋ผ๋–ผ๊ฐ€ ํƒ„์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค! ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ปคํ”ผ๋ผ๋Š” ๊ฐœ๋…์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š” ์•„๋ฉ”๋ฆฌ์นด๋…ธ๋„ ์ƒ์„ฑ! ๊ทธ๋Ÿฌ๋ฉด ์ปคํ”ผ๋Š” ๋ถ€๋ชจ Class, ๋ผ๋–ผ์™€ ์•„๋ฉ”๋ฆฌ์นด๋…ธ๋Š” ์ž์‹ Class๊ฐ€ ๋จ๋‹ˆ๋‹ค. '์ปคํ”ผ'๋Š” '์ƒท'์ด๋ผ๋Š” ํ•ญ๋ชฉ์„ ๊ฐ–๊ณ  ์žˆ๊ณ , ์ด๋ฅผ ์ƒ์†๋ฐ›์€ ์ž์‹๋“ค์ธ ๋ผ๋–ผ์™€ ์•„๋ฉ”๋ฆฌ์นด๋…ธ๋„ '์ƒท'์ด๋ผ๋Š” ํ•ญ๋ชฉ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šด๋‹ˆ๋‹ค~~ ์ดˆ๊ฐ„๋‹จ ์ƒ์† ๋—! class Coffee { let shot: Int init(shot: Int) ..

    [iOS15 ๋Œ€์‘] NavigationBar/Tabbar background color Transparent ์ด์Šˆ ํ•ด๊ฒฐ

    iOS15๋กœ ๋„˜์–ด์˜ค๋ฉด์„œ.,,, ๋„ค๋น„๊ฒŒ์ด์…˜๋ฐ”๋‚˜ ํƒญ๋ฐ”๊ฐ€ ์žˆ๋Š” ๋ทฐ์—์„œ ํ™”๋ฉด ์ „ํ™˜์„ ๋•Œ๋ฆฌ๋ฉด ๋ฐฐ๊ฒฝ์ด ํˆฌ๋ช…ํ•ด์ง€๊ณ  border line์ด ์‚ฌ๋ผ์ง€๋„๋ก ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค. ์‚ฌ์‹ค ์ด์Šˆ๋Š” ์•„๋‹Œใ„ทใ…”;; ๋‚ด ์ƒ๊ฐ๋Œ€๋กœ ์•ˆ ๋˜๋ฉด ์ด์Šˆ์ž„. ใ…‡ใ…‡ ๊ด€๋ จ ํฌ๋Ÿผ: https://developer.apple.com/forums/thread/682420 barTintColor not working in iOS 15 | Apple Developer Forums In iOS 15, UIKit has extended the usage of the scrollEdgeAppearance, which by default produces a transparent background, to all navigation bars. The background is co..

    [UIKit] UIButton Custom Design ์ ์šฉ

    ๋ถ€์ œ: ์˜ˆ์œ ๋ฒ„ํŠผ ๋งŒ๋“ค๊ธฐ phoneNumDoneBtn.backgroundColor = .gray phoneNumDoneBtn.layer.cornerRadius = 4 phoneNumDoneBtn.setTitleColor(.white, for: .normal) ์ ์šฉํ•˜๋ฉด ์ด๋Ÿฐ ๋„ˆ๋‚Œ!

    [iOS] ๋‹คํฌ๋ชจ๋“œ ๋Œ€์‘ ๋น„ํ™œ์„ฑํ™”ํ•˜๊ธฐ

    ํ”„๋กœ์ ํŠธ/Info.plist ํŒŒ์ผ์—์„œ Information Proerty List ํ•ญ๋ชฉ์— Key๋กœ Appearance๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , Value๋Š” Light๋กœ ํ•˜๋ฉด ๋””๋ฐ”์ด์Šค์™€ ์ƒ๊ด€์—†์ด ๋ผ์ดํŠธ ๋ชจ๋“œ๋กœ ๋‚˜์˜ด! ๋‹คํฌ๋ชจ๋“œ ๋Œ€์‘ ์•„์ง ๋””์ž์ธ ์ƒ๊ฐ์„ ๋ชป ํ•ด์„œ ๋ผ์ดํŠธ ๋ชจ๋“œ๋งŒ ์ง€์›ํ•˜๊ธฐ๋กœ! ์ฝ”๋“œ๋กœ Info.plist ์ˆ˜์ •ํ•˜๊ธฐ UIUserInterfaceStyle Light

    [UIKit] UITableView ๋นˆ ์…€ ์ˆจ๊ธฐ๊ธฐ

    tableView.tableFooterView = UIView(frame: CGRect.zero) ๊ทธ๋ƒฅ UIView ํ•˜๋‚˜ ๋Œ์–ด๋‹ค ์Šคํ† ๋ฆฌ๋ณด๋“œ์— ๋†“์•„๋„ ๋˜์ง€๋งŒ ์ฝ”๋“œ ํ•œ ์ค„์ด ๋” ํŽธํ•˜๊ธธ๋ž˜~~~~

    [PagingKit] Could not load NIB in bundle error ํ•ด๊ฒฐ

    PagingKit GitHub - kazuhiro4949/PagingKit: PagingKit provides customizable menu UI. It has more flexible layout and design than the other PagingKit provides customizable menu UI. It has more flexible layout and design than the other libraries. - GitHub - kazuhiro4949/PagingKit: PagingKit provides customizable menu UI. It has more fl... github.com ํŽ˜์ด์ง• ํ‚คํŠธ๋ฅผ ์ด์šฉํ•ด ๋ทฐ๋ฅผ ๋งŒ๋“  ํ›„, ๋‹ค๋ฅธ ๋ทฐ์—๋„ ํŽ˜์ด์ง• ํ‚คํŠธ๊ฐ€ ํ•„์š”ํ•ด์„œ ๊ธฐ์กด ํŒŒ์ผ๋“ค์„ ..

    [Swift] ๋‚ ์งœ๋ฅผ ๋ฌธ์ž๋กœ! Date to String

    func dateToString(_ today: Date) -> String{ let year = Calendar.current.component(.year, from: today) let month = Calendar.current.component(.month, from: today) let day = Calendar.current.component(.day, from: today) let weekdayInt = Calendar.current.component(.weekday, from: today) var weekday: String = "" switch weekdayInt { case 1: weekday = "SUN" case 2: weekday = "MON" case 3: weekday = "T..

    [Swift] ํŠน์ • ๋‚ ์งœ/์‹œ๊ฐ„ DateComponents to Date

    Calendar.current.date(from: DateComponents(year:2021, month: 7, day: 1)) * DateComponents๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๊ฐ€ ๋ชจ๋‘ ์˜ต์…”๋„์ด๋ผ ์›ํ•˜๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ๋งŒ ๋„ฃ์–ด์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅ!

    [๋„คํŠธ์›Œํ‚น] iOS Swift Alamofire ์š”์ฒญ/์‘๋‹ตํ•˜๊ธฐ(form-dataํ˜•์‹)

    ์šฐ๋ฆฌ ์„œ๋ฒ„์— json ํ˜•์‹์œผ๋กœ ํฐ๋ฒˆํ˜ธ ๋„˜๊ฒผ๋”๋‹ˆ ์ž๊พธ ๋ณ€์ˆ˜ ๋ถ€์กฑ ์—๋Ÿฌ ์ฝ”๋“œ ๋œธ -> ์„œ๋ฒ„ํŒ€์— ๋ฌผ์–ด๋ด„ -> ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ ๋ณด๋‚ผ ๋•Œ json ๋ง๊ณ  form-data ํ˜•์‹์œผ๋กœ ๋ณด๋‚ด ๋‹ฌ๋ผ๊ณ  ํ•จ -> ๊ทธ๋Ÿฐ๋ฐ Alamofire์— form-data ํ˜•์‹์œผ๋กœ ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์žˆ์—ˆ๋‹ค!!!! ํ‰์†Œ ํ•˜๋˜ ๊ฒƒ์ฒ˜๋Ÿผ(line 8์— ์ฃผ์„ ์ฒ˜๋ฆฌํ•œ ๋ถ€๋ถ„) request๋ฅผ ๋ณด๋‚ด๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ ์•„๋‹ˆ๋ผ, ์„œ๋ฒ„์— ์—…๋กœ๋“œํ•˜๋Š” ๊ฐœ๋…์ธ ๋“ฏ. ์•„๋ฌดํŠผ multipartFormData ํ™œ์šฉํ•ด์„œ ํœด๋Œ€ํฐ ๋ฒˆํ˜ธ ๋„ฃ์—ˆ๋”๋‹ˆ ์ œ๋Œ€๋กœ ์š”์ฒญ์ด ์ „์†ก๋๋‹ค. ๐Ÿฅบ //MARK: SMS request // API ํ˜ธ์ถœ let paramForSMS:Parameters = ["userphonenum": phoneField.text] let url = "์—ฌ๊ธฐ์— url ์ฃผ์†Œ ..

    [UIKit] ๊ฐ„๋‹จํ•œ toast message, ํ™•์ธ ๋ฒ„ํŠผ๋งŒ ์žˆ๋Š” alert ์˜ˆ์ œ

    extension UIViewController { func alert(_ message: String, completion: (()->Void)? = nil) { DispatchQueue.main.async { let alert = UIAlertController(title: nil, message: message, preferredStyle: .alert) let okAction = UIAlertAction(title: "ํ™•์ธ", style: .cancel) { (_) in completion?() } alert.addAction(okAction) self.present(alert, animated: false) } } } ์‚ฌ์šฉํ•  ๋•Œ์—๋Š” ์•„๋ฌด๋ฐ์„œ๋‚˜ self.alert("์•Œ๋ฆผ๋ฉ”์‹œ์ง€!!!") ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉ..

    [TIL] ์ผ๋Ÿฌ์ŠคํŠธ ๋ชจ์ž‘... ์ƒˆ ๊ทธ๋ฆฌ๊ธฐ ๊ณผ์ œ

    ์™ผ์ชฝ์ด ์›๋ณธ ์˜ค๋ฅธ์ชฝ์ด ๋ชจ์ž‘ํ•ด์„œ ๊ทธ๋ฆฐ ๊ฑฐ...~~~!!!!! ๊ฑฐ์˜ 5์‹œ๊ฐ„ ๋™์•ˆ ํ•œ ๊ฒƒ ๊ฐ™์€๋ฐ ๊ณผ์ œ ํ•˜๋‚˜ ๋” ๋‚จ์Œ ใ…‹ ์˜ค๋Š˜ ์—ํƒ€์—์„œ iOS ๊ณต๋ถ€ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค ์—†๋ƒ๋Š” ๊ธ€ ๋ณด๊ณ  ๋Œ“๊ธ€ ๋‹ฌ์•˜๋Š”๋ฐ... ์šธ ํ•™๊ต์—์„œ iOS ๊ณต๋ถ€ํ•˜๋Š” ๋‹จํ†ก์ด ์ƒ๊ฒผ๋‹ค ๐Ÿ˜š ๋…ธ์…˜ ์œ„ํ‚ค ์—ด์‹ฌํžˆ ๋งŒ๋“ค์–ด์•ผ๊ฒŸ๋”ฐ. ๋—.