๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐ŸŽ iOS122

[RxSwift] Relays์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ธฐ Relay๋ž€? Observable๊ณผ Subject๋ฅผ ํ•  ๋•Œ๋Š” RxSwift๋งŒ importํ•ด์ค˜๋„ ๋˜์—ˆ์ง€๋งŒ Relay๋Š” UI์— ์‚ฌ์šฉ ๋˜๊ณ  PublishSubject์˜ Wrapper ํด๋ž˜์Šค์ด์ž RxCocoa ํด๋ž˜์Šค ์ด๋ฏ€๋กœ RxCocoa๋ฅผ ์ž„ํฌํŠธ ํ•ด์ฃผ์–ด์•ผ ํ•จ. (RxRelay๋ผ๊ณ  ์žˆ์œผ๋‚˜ RxCocoa ์ž„ํฌํŠธ ํ•˜๋ฉด ํ•จ๊ป˜ ์ž„ํฌํŠธ ๋จ) Relay๋Š” replay subject ์™€ ๋น„์Šทํ•œ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ Subject, Observable๊ณผ ๋‹ฌ๋ฆฌ .completed, .error ์ด๋ฒคํŠธ๊ฐ€ ์—†๋‹ค. ์‹ฌ์ง€์–ด .next ์ด๋ฒคํŠธ๊ฐ€ ์•„๋‹Œ accept(_:) ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. terminate ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Dispose ๋˜๊ธฐ ์ „๊นŒ์ง€ ๋™์ž‘ํ•˜์—ฌ UI์— ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ํ•จ PublishRelay publish rela.. 2022. 1. 10.
[RxSwift] Subject ์•Œ์•„๋ณด๊ธฐ Subject๋ž€ ๋ฌด์—‡์ผ๊นŒ? Subject๋Š” Observable๊ณผ Obsever ๋‘˜๋‹ค ํ•  ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ Observable์€ ๊ด€์ฐฐ ๋Œ€์ƒ์ด๋‹ค. Observable์€ ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ํ๋ฆ„์„ ์ƒ์„ฑํ•˜๊ณ  Observer๊ฐ€ Observable์„ ๊ตฌ๋…ํ•˜์—ฌ ์ด๋ฒค๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค. Subject๋Š” ์ด ๋‘˜์„ ๋‹ค ํ•˜๋Š” ํƒ€์ž…์œผ๋กœ ๊ด€์ฐฐ๊ฐ€๋Šฅํ•œ ํ๋ฆ„์„ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฒคํŠธ๋ฅผ ๋ฐฉ์ถœ์‹œํ‚ค๋ฉฐ ์•Œ๋งž๋Š” ์ด๋ฒคํŠธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ฒŒ ๋œ๋‹ค. Subject ํƒ€์ž… - PublishSubject : ์–ด๋– ํ•œ ๊ฐ’๋„ ์—†์ด ์ƒ์„ฑ๋˜๋ฉฐ ์˜ค์ง ์ƒˆ๋กœ์šด ๊ตฌ๋…์ž์—๊ฒŒ elements๋ฅผ ๋ฐฉ์ถœํ•œ๋‹ค. - BehaviorSubject : ์ดˆ๊ธฐ๊ฐ’๊ณผ ํ•จ๊ป˜ ์ƒ์„ฑ๋˜๋ฉฐ ์ด ์ƒ์„ฑ๋œ ๊ฐ’์„ ๊ตฌ๋…์ž์—๊ฒŒ ์žฌ์ƒ์‹œํ‚ค๊ณ  ์ตœ์‹ ์˜ elements์„ ์žฌ์ƒ์‹œํ‚จ๋‹ค. - ReplaySubject : ๋ฒ„ํผ์‚ฌ์ด์ฆˆ์™€ ํ•จ๊ป˜ ์ƒ์„ฑ. e.. 2022. 1. 9.
[RxSwift] Traits ์™€ side effect & Subject ๊ธฐ๋ณธ Traits traits์€ ๊ธฐ์กด Observable ๋ณด๋‹ค ์ข€๋” ์ž‘์€ ๋ฒ”์œ„์˜ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•˜๋Š” Observable ์ด๋‹ค ํ•„์ˆ˜๋กœ ์•Œ์•„์•ผ ํ•˜๋Š” ๊ฐœ๋…์€ ์•„๋‹ˆ๋‹ค ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ์ž‘์„ฑํ•œ ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด ๋ณผ๋•Œ ์ข€๋” ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ผญ ํ•„์š”ํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋ž€ ๋ง์”€ Single : .success(value) == .nextํ˜น์€ .error == .completed ์ด๋ฒคํŠธ๋ฅผ ๋ฐฉ์ถœํ•œ๋‹ค ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์šด๋กœ๋“œ ํ•˜๊ฑฐ๋‚˜ ๋””์Šคํฌ๋กœ ๋ถ€ํ„ฐ ๋กœ๋”ฉ์ด ๊ฑธ๋ฆด ๋•Œ ์‚ฌ์šฉ๋˜๋‚˜ ๋ณด๋‹ค Completable .completed ํ˜น์€ .error ์ด๋ฒคํŠธ๋ฅผ ๋ฐ˜ํ™˜. ์–ด๋– ํ•œ ๊ฐ’๋„ ๋ฐฉ์ถœํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋งŒ์•ฝ์— ์˜ค์ง ์„ฑ๊ณต๊ณผ ์‹คํŒจ๋กœ ๋๋‚˜๋Š” ์˜คํผ๋ ˆ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ํŒŒ์ผ์„ ์ฝ๊ณ  ๊ทธ๊ฒƒ์ด ์„ฑ๊ณตํ–ˆ๋Š”์ง€ ์•ˆํ–ˆ๋Š”์ง€ ๋ฐฉ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. Maybe singl.. 2022. 1. 7.
[RxSwift] DisposeBag ๊ณผ Operator observable์€ subscription๋˜๊ธฐ ์ „๊นŒ์ง€ ์•„๋ฌด๋Ÿฐ ์ด๋ฒคํŠธ๋„ ๋ฐฉ์ถœํ•  ์ˆ˜ ์—†๋‹ค -> ์•„๋ฌด๊ฒƒ๋„ ํ•  ์ˆ˜ ์—†์Œ subscription์ด ์˜ต์ €๋ฒ„๋ธ”์ด ๋™์ž‘ํ•˜๋„๋ก ์ƒˆ๋กœ์šด ์ด๋ฒคํŠธ๋ฅผ ๋ฐฉ์ถœํ•˜๋„๋ก ํ•˜๊ณ  .error ํ˜น์€ .completed ์ด๋ฒคํŠธ๋ฅผ ๋ฐฉ์ถœํ•˜๊ฒŒ ํ•˜๋ฉฐ ์ข…๋ฃŒ์‹œํ‚ค๊ฒŒ ํ•˜๋Š” ํŠธ๋ฆฌ๊ฑฐ ๊ฐ™์€ ์—ญํ™œ์„ ํ•˜๋Š” ๊ฒƒ! ๊ทธ๋ ‡๋‹ค๋ฉด ๋”์ด์ƒ ์˜ต์ €๋ฒ„๋ธ”์ด ํ•„์š” ์—†์–ด์ง€๊ฑฐ๋‚˜ ๋” ์ด์ƒ ์ด๋ฒคํŠธ๋ฅผ ๋ฐฉ์ถœํ•˜๊ณ  ์‹ถ์ง€ ์•Š๋‹ค! ํ•  ๋•Œ๋Š” ์œ ํŠœ๋ธŒ ์ฒ˜๋Ÿผ ๊ตฌ๋… ์ทจ์†Œ ํ•  ์ˆ˜ ์žˆ์Œ ์ด๊ฑธ ์ˆ˜ํ–‰ ํ•˜๋Š” ๊ฒƒ์ด Disposing์˜ ๊ฐœ๋…์ด๊ณ  observable์€ ์ฆ‰์‹œ ์ข…๋ฃŒ๋œ๋‹ค! $0์„ default argument๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฑธ ์ฒ˜์Œ ์•Œ์•˜๋‹น. ์ฑ…์—์„œ์˜ ํ‘œํ˜„์ธ๊ฐ€? let disposeBag = DisposeBag() ์ด๋ ‡๊ฒŒ DisposeBag์„ ์ƒ์„ฑํ•˜์—ฌ ํ•œ๋ฒˆ์— ๊ด€๋ฆฌ๊ฐ€ ๊ฐ€๋Šฅํ•˜.. 2022. 1. 6.
[RxSwift] Observable, Operators ๊ทธ๋ฆฌ๊ณ  subscribe - ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ”Œ๋กœ์šฐ ์•„ํ‚คํ…์ฒ˜์— ์ ์šฉ์‹œํ‚ค๊ธฐ ์œ ๋ฆฌํ•จ - ๋ฐ˜์‘ํ˜•์•ฑ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ํ”„๋กœ์ ํŠธ๋ฅผ ์ƒˆ๋กœ ๋งŒ๋“ค ํ•„์š”๋Š” ์—†์Œ(์ผ๋ถ€์˜ ์ฝ”๋“œ๋“ค์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ , ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ๋“ค์„ RxSwift๋กœ ์ •์˜ํ•˜๋ฉด ๋˜๊ฒ ๋‹ค) - MVVM + RxSwift ์กฐํ•ฉ ใ„ด ViewModel Observable ํ”„๋กœํผํ‹ฐ๋ฅผ ๋ฐฉ์ถœํ•˜๊ฒŒ ํ•˜๋Š”๋ฐ ์ด๋Š” View controller์˜ ๊ณ ์ •๋œ ์ฝ”๋“œ์—์„œ UIKit controls๊ฐ€ ์ง์ ‘์ ์œผ๋กœ ๋ฐ”์ธ๋“œ ๋˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Œ -> Observable ํ”„๋กœํผํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ด์„œ UIKit์˜ Controls ์š”์†Œ๋ฅผ ์˜ต์ €๋น™ ํ•  ์ˆ˜ ์žˆ์Œ Podfile์—์„œ 2022๋…„ 1์›” ๊ธฐ์ค€ ์•„๋ž˜ pod ์ถ”๊ฐ€ pod 'RxSwift', '6.1.0' pod 'RxCocoa', '6.1.0' pod install ๋กœ ์„ค์น˜ ์™„๋ฃŒ ํ›„ ํ”„๋กœ์ ํŠธ ์žฌ.. 2022. 1. 5.
[iOS/Swift] Custom Font ์‚ฌ์šฉํ•˜๊ธฐ ์‚ฌ์šฉํ•  ํฐํŠธ ๋‹ค์šด๋กœ๋“œ ๋ฐ xCode ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€ ํด๋”์— ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์œผ๋กœ ๋„ฃ์–ด์ค๋‹ˆ๋‹ค. ๋ˆˆ๋ˆ„ - ์ƒ์—…์šฉ ๋ฌด๋ฃŒํ•œ๊ธ€ํฐํŠธ ์‚ฌ์ดํŠธ ์ƒ์—…์ ์œผ๋กœ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌด๋ฃŒ ํ•œ๊ธ€ ํฐํŠธ๋ฅผ ๋ชจ์•„ ๋†“์€ ์‚ฌ์ดํŠธ ๋ˆˆ๋ˆ„ noonnu.cc ๋ˆˆ๋ˆ„์—์„œ ์ƒ์—…์šฉ์œผ๋กœ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ๋ฌด๋ฃŒ ํ•œ๊ธ€ ํฐํŠธ๋ฅผ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์„ ์ˆ˜ ์žˆ์Œ Copy items if needed ์˜ต์…˜์„ ์„ ํƒํ•˜๋ฉด xCode ํ”„๋กœ์ ํŠธ ํด๋” ๋‚ด๋ถ€์— ๋ณต์ œ๋˜์ง€๋งŒ ํ•ด์ œํ•˜๋Š” ๊ฒฝ์šฐ ์›๋ž˜ ํฐํŠธ๊ฐ€ ์žˆ์—ˆ๋˜ ํด๋”์™€ ์—ฐ๊ฒฐ๋งŒ ๋ฉ๋‹ˆ๋‹ค. ! ์ค‘์š” : ํฐํŠธ๋ฅผ ์‚ฌ์šฉํ•  ํƒ€๊ฒŸ์„ ์„ ํƒํ•ด ์คŒ ๋‹ค์Œ์œผ๋กœ Info.plist ํŒŒ์ผ์— Fonts provided by application ํ‚ค๋ฅผ ์ถ”๊ฐ€ํ•ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. UIAppFonts ์ถ”๊ฐ€ํ•ด ์ค€ ํฐํŠธ๋ฅผ info.plist์— ์ถ”๊ฐ€ํ•ด ์ฃผ์–ด์•ผ ์‚ฌ์šฉ๊ฐ€๋Šฅ ๊ผญ ํ™•์žฅ์ž ๊นŒ์ง€ ๊ฐ™์ด ์ž…๋ ฅ์„ ํ•ด.. 2021. 12. 19.
[Swift] RIBs Architecture ๊ฐœ์š”์™€ ํ…œํ”Œ๋ฆฟ ์„ค์ • ๋ทฐ ์—†์ด ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์ž˜ ์—†๊ณ  ๊ณต์‹์ ์ธ ํ”„๋กœ์ ํŠธ์—์„œ ์ด๋Ÿฌํ•œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•˜์ง€๋„ ์•Š๊ธฐ ๋•Œ๋ฌธ์— RIBs ์„ ๊ณต๋ถ€ํ•ด์•ผ ๊ฒ ๋‹ค๊ณ  ๋งˆ์Œ๋จน๊ธฐ ๊นŒ์ง€ ๊ต‰์žฅํžˆ ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค. ๋™์  ํ…Œ์ŠคํŠธ์™€ UI ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ „๋ถ€์˜€๋Š”๋ฐ ์ด๋ฒˆ์— ๊ทœ๋ชจ๊ฐ€ ์ข€ ์žˆ๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ํ•ด๋ณด๋ฉด์„œ ํ…Œ์ŠคํŠธ์˜ ์ค‘์š”์„ฑ์„ ๊นจ๋‹ซ๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ , ๊ธฐํš์ด ๋ฐ”๋€” ๋•Œ ๋งˆ๋‹ค ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์•„๋‹Œ UI๊ฐ€ ์ˆ˜์ •๋˜์–ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์„ ๋ณด๋ฉด์„œ ์™œ ์•„ํ‚คํ…์ฒ˜๋ฅผ ๋„์ž…ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๋Š๋ผ๊ฒŒ ๋˜์—ˆ๋‹ค. UI๊ฐ€ ๋น„์ฆˆ๋‹ˆ์Šค์™€ ๊ธด๋ฐ€ํ•  ์ˆ˜๋ก ์ˆ˜์ •ํ•˜๋Š”๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ๋‹ค. ๊ฒฐ๊ตญ MVVC, MVVM ๋“ฑ์„ ๊ธฐ์›ƒ ๊ฑฐ๋ฆฌ๋‹ค๊ฐ€ RIBs๋ผ๋Š” ์•„ํ‚คํ…์ฒ˜๋ฅผ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์šฐ๋ฒ„์—์„œ ์ œ์ž‘ํ•œ ์•„ํ‚คํ…์ฒ˜์ด๋ฉฐ ๋ทฐ๋ฅผ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์œ„ํ•œ RIB ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ๊ณผ ํ…Œ์ŠคํŠธ์˜ ์šฉ์ด์„ฑ์ด๋ผ๋Š” ๋ง.. 2021. 11. 12.
[Swift] push notification ์ •๋ฆฌ (with Firebase) permission๊ณผ ํ‘ธ์‹œ ๋ฐ›์„ ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜ ์นด์นด์˜คํ†ก์„ ์‹คํ–‰์‹œํ‚ค์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์ƒ๋Œ€๋ฐฉ์œผ๋กœ ๋ถ€ํ„ฐ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›์„ ๋•Œ ์˜ค๋Š” ์•Œ๋žŒ, ํ˜น์€ ์•ฑ์—์„œ ๊ด‘๊ณ ๋ฅผ ๋ณด๋‚ด๊ธฐ ์œ„ํ•ด์„œ ๋“ฑ๋“ฑ ๋งŽ์€ ๊ณณ์—์„œ push notification์ด ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹น ๊ฑฐ์˜ ํ”„๋กœ์ ํŠธ ํ•  ๋•Œ๋งˆ๋‹ค ํ•„์ˆ˜๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ๋„ ํ•˜๊ณ  ์ฒ˜์Œ์— ํ•˜๋‹ค๋ณด๋ฉด ๊ฝค๋‚˜ ๋ณต์žกํ•ด์„œ ์ด๋ฒˆ ๊ธฐํšŒ์— ์ •๋ฆฌํ•ด ๋ณด๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹น ๐Ÿฆ‘๐Ÿฆ‘๐Ÿฆ‘ push notification์ด๋ž€ Apple Push Notification service = APNs๋ฅผ ์ด์šฉํ•ด์„œ ์•ฑ์œผ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹น ์•ฑ์ด ์‹คํ–‰๋˜์ง€ ์•Š์€ ์ƒํƒœ๋‚˜ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์— ์ž ๋“ค์–ด ์žˆ๋Š” ์ƒํƒœ์—์„œ๋„ ์‚ฌ์šฉ์ž์—๊ฒŒ ํ‘ธ์‹œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹น โญ ๋‹น๊ทผ~ ํ˜น์€ ์นดํ†ก! ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์›ํ•˜๋Š” ์‚ฌ์šด๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์งง์€ ํ…์ŠคํŠธ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค ๋˜ํ•œ ์•ฑ ์•„์ด์ฝ˜ ์˜†์— ๋œจ๋Š” ๋ฑƒ์ง€์˜.. 2021. 10. 27.
[SwiftUI 3.0] URLSession ๊ณผ List, @Published, @ObservedObject ์‚ฌ์šฉํ•˜๊ธฐ SwiftUI ์—์„œ๋Š” ๋ทฐ์—์„œ ์‚ฌ์šฉํ•  ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด ๊ธฐ์กด Storyboard ๋ฐฉ์‹๊ณผ๋Š” ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ๋ทฐ ๋ฐ–์˜ ํด๋ž˜์Šค์—์„œ ์‚ฌ์šฉ๊ฐ€๋Šฅํ•œ ํ”„๋กœํผํ‹ฐ์›Œ๋ ˆํผ ์ธ @ObservedObject๋ฅผ ์†Œ๊ฐœํ•˜๊ณ  ์•„์ฃผ ๊ฐ„๋‹จํ•œ ํŠœํ† ๋ฆฌ์–ผ๋กœ ์‚ฌ์šฉ๋ฒ•์„ ์ •๋ฆฌํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค @ObservedObject๋ฅผ ์•Œ๊ธฐ ์ „์— ObservableObject์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณผ๊ฒŒ์š” ObservableObject๋Š” Combine์— ์†ํ•œ ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค ํ•ด๋‹น ํฌ์ŠคํŒ…์—์„œ Combine์„ ๋‹ค๋ฃจ์ง€ ์•Š์ง€๋งŒ RxSwift์˜ ๊ธฐ๋Šฅ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋˜์š” @ObservedObject๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ ObservableObject ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•ด ์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. @ObservedObject๋Š” ํ•ด๋‹น ํ”„๋กœํผํ‹ฐ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด @Published ํ”„๋กœํผํ‹ฐ ์›Œ๋ ˆํผ๊ฐ€ ์ž๋™์œผ๋กœ.. 2021. 10. 27.
[iOS/swift] UINavigaitonBar tint color iOS 15 + iOS 14์˜ ๊ฒฝ์šฐ large title ์—์„œ ์ ์šฉ๋˜์—ˆ๋˜ scrollEdgeAppearance ์†์„ฑ์ด iOS15์—์„œ๋Š” ๋ชจ๋“  ๋„ค๋น„๊ฒŒ์ด์…˜์— ์ ์šฉ๋œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.. iOS 15์—์„œ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑํ•˜์—ฌ ๋„ค๋น„๊ฒŒ์ด์…˜์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๊ธฐ์กด์— ๋„ค๋น„๊ฒŒ์ด์…˜์„ ์‚ฌ์šฉํ•œ ํ”„๋กœ์ ํŠธ๋„ ํ•œ๋ฒˆ์”ฉ ํ™•์ธํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์•„์š” ๐Ÿค” scrollEdgeAppearance ๋Š” ์Šคํฌ๋กค ๊ฐ€๋Šฅํ•œ ์ปจํ…์ธ ์˜ edge๊ฐ€ navigation bar ์˜ edge์™€ ์ •๋ ฌ๋˜๋Š” ๊ฒฝ์šฐ appearance๋ฅผ ์„ธํŒ…ํ•ด ์ค๋‹ˆ๋‹ค! ์˜ˆ๋ฅผ ๋“ค์–ด์„œ big title์˜ ๊ฒฝ์šฐ title์ด ๋„ค๋น„๊ฒŒ์ด์…˜์— ๊ทธ๋ ค์ง€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹น ์ด ์†์„ฑ์˜ default ๊ฐ’์€ nil ์ด์ง€๋งŒ iOS 15 ๋ถ€ํ„ฐ๋Š” ๋ชจ๋“  ๋„ค๋น„๊ฒŒ์ด์…˜์— ์ ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๋Š” ๋„ค๋น„๊ฒŒ์ด์…˜์€ ํˆฌ๋ช…ํ•˜๊ฒŒ ๊ทธ ์ดํ›„ ์Šคํฌ๋กค ์ปจํ…์ธ ๋ฅผ.. 2021. 10. 21.
[swift 5] ๋ฐฐ์—ด ํ˜•์‹์˜ ๋ฌธ์ž์—ด ๋งŒ๋“ค๊ธฐ let imageList = ["image1", "image2", "image3"] ์™€ ๊ฐ™์€ ๋ฐฐ์—ด์ด ์žˆ์„ ๋•Œ "[image1, image2, image3]" ํ˜•์‹์˜ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พธ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. func arrayToString(list: [String]) -> String { let itemStr = list.joined(separator: ", ") return "[" + itemStr + "]" } joined๋ฅผ ์‚ฌ์šฉํ•ด์„œ ๊ฐ ๋ฐฐ์—ด ์•„์ดํ…œ ์‚ฌ์ด ์‚ฌ์ด์— ์‰ผํ‘œ๋ฅผ ์ถ”๊ฐ€ ํ•ด์ฃผ๋Š” ์ฝ”๋“œ ์ž…๋‹ˆ๋‹ค. json ํ†ต์‹ ํ•  ๋•Œ ๊ฐ€๋” ๊ฐ ์•„์ดํ…œ์„ ์–ด๋ ˆ์ด ํ˜•์‹์˜ ์ŠคํŠธ๋ง์œผ๋กœ ๋งŒ๋“ค์–ด ๋ณด๋‚ด์•ผ ํ•˜๋Š”๋ฐ ์œ„์™€ ๊ฐ™์ด ๋ณด๋‚ด ์ค๋‹ˆ๋‹ค. ํ‹€๋ฆฐ ๋‚ด์šฉ์ด ์žˆ๊ฑฐ๋‚˜ ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์žˆ์œผ๋ฉด ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ ค์šค ๐Ÿค— ์ฐธ๊ณ  ์‚ฌ์ดํŠธ https://stackoverflo.. 2021. 7. 26.
Swift 5 beginDisablingInterfaceAutorotation Ignoring ๋””๋ฒ„๊น… -[UIWindow endDisablingInterfaceAutorotationAnimated:] called on without matching -beginDisablingInterfaceAutorotation. Ignoring. ์ •์ƒ์ ์ธ ์ƒํ™ฉ์—์„œ๋Š” ํ˜ธ์ถœ ๋˜์ง€ ์•Š๋Š” ๋ฉ”์‹œ์ง€ ์ž…๋‹ˆ๋‹ค. ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋Š” ์•„๋‹ˆ๊ณ  ๊ทธ๋ƒฅ ์ด๋ ‡๋‹ค ~ ์ •๋„์˜ ๋ฉ”์‹œ์ง€ ์ธ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(Ignoring!!!) ์ฝ˜์†”์— ์ฐ์–ด ๋ณด์ง€๋„ ์•Š์•˜๋Š”๋ฐ ์—๋Ÿฌ๋ฅผ ์•Œ๋ฆฌ๋Š” ๊ฒƒ ๊ฐ™์€ ๋ฉ”์‹œ์ง€๊ฐ€ ๋…ธ์ถœ๋œ๋‹ค? ์ •์ƒ์ ์ธ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๊ฑด ์•„๋‹ˆ๋‹ˆ๊นŒ ์ด์œ ๋ฅผ ์ฐพ์•„๋ณด์ž๋ฉด ์ฃผ๋กœ ํ‚ค๋ณด๋“œ์—์„œ ๋‚˜ํƒ€๋‚˜๋Š” ์—๋Ÿฌ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด let textField = UITextField() textField.resignFirstResponder() ์Šคํฌ๋กค ํ•ด์„œ ๋ทฐ๋ฅผ ๋‹ซ์„ ๋•Œ ํŒฌ์ œ์Šค์ฒ˜ ๋๋‚˜๋Š” ์‹œ์ ์—์„œ ํ•œ.. 2021. 7. 12.