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

์ „์ฒด ๊ธ€179

[iOS/RxSwift] RxSwift์™€ RxRealm์œผ๋กœ UICollectionView์‚ฌ์šฉํ•˜๊ธฐ Realm์€ Object๋ฅผ ์ƒ์† ๋ฐ›๋Š” ํด๋ž˜์Šค๋ฅผ ํƒ€์ž…์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ฒ ์ด์Šค์— ์ €์žฅ๋œ ๊ฐ์ฒด๋“ค์„ ์ฝ์–ด ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. private lazy var results = try! Realm().objects(Category.self) keyPath์— ์ „๋‹ฌ๋œ ํ•„๋“œ๊ฐ’์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ, ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ์„ ํ•ด์„œ ์ „๋‹ฌ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. id ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ํ•ด์ฃผ๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ ์ž‘์„ฑํ•ด ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค. var updates = try! Realm().objects(Category.self).sorted(byKeyPath: "id", ascending: true) ์ด๋ ‡๊ฒŒ ์ ์–ด ์ฃผ์–ด๋„ ๋˜๊ณ  ์ „์—ญ ๋ณ€์ˆ˜๋กœ realm ๊ฐ์ฒด๋ฅผ ๋”ฐ๋กœ ๋นผ์ฃผ์–ด๋„ ๋ฉ๋‹ˆ๋‹ค let realm = try! Realm() var updates = realm.objects.. 2022. 9. 19.
[iOS/Swift/Library] IQKeyboardManager FirstResponder๋œ UITextField์™€ UITextView๊ฐ€ ํ™”๋ฉด์— ๋ณด์ด๋„๋ก ํ™”๋ฉด ์œ„์น˜๋ฅผ ์ž๋™์œผ๋กœ ์ด๋™ ์‹œ์ผœ์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ AutoTool์„ ์‚ฌ์šฉํ•˜๋ฉด ํ‚ค๋ณด๋“œ์˜ ํˆด๋ฐ”๋กœ ๋‹ค์Œ ํ˜น์€ ์ด์ „ UITextField๋‚˜ UITextView๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณต ํ•จ IQkeyboardManager.shared.enable = true ๋ฅผ AppDelegate๋‚˜ SceneDelegate์— ์ถ”๊ฐ€ํ•ด ์คŒ class AppDelegate: UIResponder, UIApplicationDelegate { func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchO.. 2022. 9. 16.
[iOS/XCode] ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํ•œ๊ธ€ ์žํŒ ์‚ฌ์šฉํ•˜๊ธฐ, ํ‚ค๋ณด๋“œ ๊บผ๋‚ด๋Š” ๋ฒ• ์šฐ์„  ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์—์„œ ํ‚ค๋ณด๋“œ๋ฅผ ๊บผ๋‚ด๋Š” ๋‹จ์ถ•ํ‚ค๋Š” Command + Shift + k ์ž…๋‹ˆ๋‹ค ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ์— ํ•œ๊ธ€ ์ž…๋ ฅ์ด ์•ˆ๋ ๋•Œ๊ฐ€ ์žˆ๋Š”๋ฐ ์‹ฌ์ง€์–ด ํ‚ค๋ณด๋“œ์— ํ•œ๊ธ€ ์žํŒ๋„ ์—†์–ด์„œ ๋ถˆํŽธํ•  ๋•Œ ์„ค์ •์—์„œ ์‰ฝ๊ฒŒ ํ•œ๊ธ€ ์žํŒ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค~ Simulator ์—์„œ Settings๋กœ ๋“ค์–ด๊ฐ€ ์ค๋‹ˆ๋‹ค General ๋ฉ”๋‰ด๋กœ ๋“ค์–ด๊ฐ€ ์ฃผ์„ธ์š”! ์ƒ๋‹จ์— Keyboard ๋ฉ”๋‰ด๊ฐ€ ๋ณด์ผ ๊บผ์—์š”! ํƒญํ•ด์ค๋‹ˆ๋‹ค Keyboards ๋กœ ๋“ค์–ด๊ฐ€ ์ค๋‹ˆ๋‹ค! ์ฒซ๋ฒˆ์งธ ํ•ญ๋ชฉ์ด์—์š” Add New Keyboard ๋ฅผ ๋ˆŒ๋Ÿฌ์„œ ํ‚ค๋ณด๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด ์ค์‹œ๋‹ค Korean๋ฅผ ์ž…๋ ฅํ•ด ์ค๋‹ˆ๋‹ค ์ผ๋ถ€๋ถ„๋งŒ ์ž…๋ ฅํ•ด๋„ ํ•˜๋‹จ์— ๋œน๋‹ˆ๋‹ค! Standard ๋ˆŒ๋Ÿฌ์ฃผ์‹œ๊ณ  Done ๋ˆŒ๋Ÿฌ ์ฃผ์„ธ์š” ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ํ‚ค๋ณด๋“œ์—์„œ ์ง€๊ตฌ๋ณธ ๋ชจ์–‘ ๋ˆ„๋ฅด์‹œ๋ฉด ์˜์–ด/ํ•œ๊ธ€ ํ† ๊ธ€ ๋ฉ๋‹ˆ๋‹ค ๐Ÿฅณ 2022. 9. 14.
[Swift] MVVMC ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ - ํŠœํ† ๋ฆฌ์–ผ 4 (child coordinator ์‚ญ์ œํ•˜๊ธฐ) 2022.07.10 - [๐ŸŽ iOS/Architecture Pattern] - [Swift] MVVMC ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ - ํŠœํ† ๋ฆฌ์–ผ 1 (Coordinator์™€ AppCoordinator ๊ตฌํ˜„ํ•˜๊ธฐ) 2022.07.11 - [๐ŸŽ iOS/Architecture Pattern] - [Swift] MVVMC ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ - ํŠœํ† ๋ฆฌ์–ผ 2 (childCoordinator๋กœ ์ด๋™ํ•˜๊ธฐ) 2022.07.12 - [๐ŸŽ iOS/Architecture Pattern] - [Swift] MVVMC ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ธฐ - ํŠœํ† ๋ฆฌ์–ผ 3 (๋ฒ„ํŠผ ๋ˆŒ๋Ÿฌ์„œ ํ™”๋ฉด ์ „ํ™˜ํ•˜๊ธฐ) ํ•ด๋‹น ํŠœํ† ๋ฆฌ์–ผ์€ ์œ„ ๊ธ€๊ณผ ์ด์–ด์ง‘๋‹ˆ๋‹ค! ์ด์ „ ํฌ์ŠคํŒ…์—์„œ Coordinator์™€ ํ™”๋ฉด ์ „ํ™˜์— ๋Œ€ํ•ด ๋‹ค๋ฃจ์–ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. MVVMC์—์„œ View์™€ Coordinator์— ๋Œ€ํ•ด.. 2022. 9. 5.
[iOS] Fastlane์œผ๋กœ ์•ฑ ๋ฐฐํฌ ์ž๋™ํ™”ํ•˜๊ธฐ - ์ด๋ก ๊ณผ ์„ค์น˜ ์™œ Fastlane์„ ์‚ฌ์šฉํ–ˆ์„๊นŒ? ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์ด์ „์— ์ง„ํ–‰ํ•œ ํ”„๋กœ์ ํŠธ์˜ ์œ ์ง€ ๋ณด์ˆ˜๋ฅผ ๋งก๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์ง€ ๋ณด์ˆ˜ ์ค‘์ธ ์•ฑ์€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋งŽ์ง„ ์•Š์ง€๋งŒ ์กฐ๊ธˆ์˜ ์ˆ˜์ •๋งŒ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด 6๊ฐœ์˜ ์•ฑ์„ ๋นŒ๋“œํ•˜์—ฌ in house๋กœ ๋ฐฐํฌํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ํ›„ QA๋ฅผ ๊ฑฐ์น˜๊ฒŒ ๋˜๋Š”๋ฐ ์ด ๊ธฐ๊ฐ„ ๋™์•ˆ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์ด ์žˆ๋‹ค๋ฉด ๋‹ค์‹œ ์ˆ˜์ •์„ ํ•˜๊ณ  6๊ฐœ์˜ ์•ฑ์„ ๋นŒ๋“œํ•ด์„œ ๋ฐฐํฌํ•ด์•ผ ํ–ˆ์–ด์š”. QA๊ฐ€ ๋๋‚˜๋ฉด ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๊ณ„์ •์œผ๋กœ ๋‹ค๋ฅธ ์„œ๋ฒ„์— ๋ฐฐํฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ์ˆ˜์ •์ด๋‚˜ ์š”๊ตฌ ์‚ฌํ•ญ์€ ์ ์ง€๋งŒ ์กฐ๊ธˆ์˜ ์ˆ˜์ •์œผ๋กœ 6๊ฐœ์˜ ์•ฑ์˜ ๋นŒ๋“œ(ํ•˜๋Š” ๊ฒƒ๋„ ์˜ค๋ž˜ ๊ฑธ๋ฆผ)์™€ ๋ฐฐํฌํ•˜๋Š” ์‹œ๊ฐ„์ด ๋„ˆ๋ฌด ์˜ค๋ž˜ ๊ฑธ๋ ค์„œ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋Š” ํ”„๋กœ์ ํŠธ์—๋„ ์˜ํ–ฅ์ด ์˜ค๋”๋ผ๊ตฌ์š”(์—ฌ๋Ÿฌ๊ฐœ์˜ ์•ฑ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด ํšŒ์˜๋ฅผ ์ˆ˜์‹ญ ๋ฒˆ ํ–ˆ์ง€๋งŒ ์•ˆ์ •์„ฑ์˜ ์ด์œ .. 2022. 9. 5.
[CI/CD] ์ง€์†์  ํ†ตํ•ฉ๊ณผ ์ง€์†์  ๋ฐฐํฌ์˜ ๊ฐœ๋…๊ณผ ์žฅ์  Intro ์ด์ „์— ๊ต‰์žฅํžˆ ํฅ๋ฏธ๋กœ์šด ์˜์ƒ์„ ๋ณธ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์„œ๋น„์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ๊ธฐํšํ•˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณต๋˜๋Š”์ง€์— ๊ด€๋ จ๋œ ์˜์ƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋งˆ๋‹ค ๋ฒ„ํŠผ ๋ฐฐ์น˜๋ฅผ ๋‹ค๋ฅด๊ฒŒ ๋ณด์ด๊ฒŒ ํ•ด์„œ ์–ด๋–ค ์œ„์น˜์˜ ๋ฒ„ํŠผ์ด ๋” ๋งŽ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ˆŒ๋ ธ๋Š”์ง€ ๋กœ๊ทธ๋ฅผ ์ˆ˜์ง‘ํ•˜๊ณ , ์ด์— ๋”ฐ๋ผ ์˜์‚ฌ ๊ฒฐ์ •์„ ํ•œ๋‹ค๋Š” ๋‚ด์šฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋•Œ ์ด ๋ฒ„ํŠผ์˜ ์œ„์น˜๋ฅผ ๋ฐ”๊พธ๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์ž˜ ๊ตฌ์ถ•ํ•ด ๋†“์•„์„œ ์กฐ๊ธˆ์˜ ์ˆ˜์ •์œผ๋กœ ๋น ๋ฅด๊ฒŒ A์•ˆ B ์•ˆ์„ ํ…Œ์ŠคํŠธ ํ•ด ๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ์ž‘์€ ์ผ๋ถ€๋ถ„์„ ์ˆ˜์ • ํ•˜๋Š” ๊ฒƒ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์„œ๋น„์Šค๋ฅผ ์šด์˜ํ•˜๋‹ค ๋ณด๋ฉด ๋ฒ„๊ทธ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ฒŒ ๋˜๊ณ  ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐฐํฌํ•˜์—ฌ ์„œ๋น„์Šคํ•˜๋Š” ์ผ์ด ์žฆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๊ฒŒ ๋˜๋ฉด ์ด ์ฝ”๋“œ์— ๋Œ€ํ•œ ๊ฒ€์ฆ์„ ์œ„ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฅผ ํ•˜๊ณ  QA๊ฐ€ ์ด๋ฃจ์–ด์ง„ .. 2022. 9. 3.
unable to boot the simulator launchd failed to respond ํ•ด๊ฒฐ๋ฒ• ์ƒ๋‹จ xCode ํด๋ฆญ > Preferences ํด๋ฆญ Locations ํƒญ ํด๋ฆญ > ํ•˜๋‹จ Derived Data ์˜ ํด๋” ๊ฒฝ๋กœ์—์„œ ํด๋” ์ด๋™ํ•˜๊ธฐ ์•„์ด์ฝ˜ ํด๋ฆญ ํด๋”์—์„œ ํ•„์š”์—†๋Š” DerivedData ์ง€์›Œ ์ฃผ๊ธฐ ๋นŒ๋“œ ํ›„ ์‹œ๋ฎฌ๋ ˆ์ดํ„ฐ ์žฌ ์‹คํ–‰ 2022. 8. 22.
[iOS/Swift] UIImagePickerController ์‚ฌ์šฉํ•˜๊ธฐ UIImagePickerController ๊ฐ์ฒด ์ƒ์„ฑ private lazy var picker = UIImagePickerController().then { $0.delegate = self } or var picker = UIImagePickerController() override func viewDidLoad() { picker.delegate = self } ๋ฒ„ํŠผ target ์„ค์ • imageButton.addTarget(self, action: #selector(presentPhotoPicker), for: .touchUpInside) @objc func presentPhotoPicker() { present(picker, animated: true) } UIImagePickerControlle.. 2022. 8. 21.
[Swift/iOS] UICollectionView layout ์—…๋ฐ์ดํŠธ collectionView.collectionViewLayout.invalidateLayout() ๋ ˆ์ด์•„์›ƒ ์†์„ฑ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์„๋•Œ ๋ช…์‹œ์ ์œผ๋กœ ๋ ˆ์ด์•„์›ƒ์„ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ์Œ 2022. 8. 20.
[iOS/Swift] UITableView Header ๋†’์ด ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ ์Šคํฌ๋กค ์‹œ UITableView Header๋ฅผ ๊ณ ์ • ์‹œํ‚ฌ ์ˆ˜๊ฐ€ ์žˆ๋Š”๋ฐ ํ—ค๋”์— ์žˆ๋Š” ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ํ—ค๋”์˜ ๋†’์ด๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ ex) ํ—ค๋” ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ๊ฒ€์ƒ‰ ์˜์—ญ ๋…ธ์ถœ UITableViewHeaderFooterView ์— ๋†’์ด ์—…๋ฐ์ดํŠธ ํ•˜๋Š” ์ฝ”๋“œ ์ž‘์„ฑ func toggleHeight() { containerView.snp.updateConstraints { make in make.height.equalTo(searchButton.tag).priority(.high) } } header ์ง€์ •ํ•˜๋Š” Delegate์—์„œ ํ—ค๋”์˜ ๋ฒ„ํŠผ์— addTarget ํ•ด์คŒ ์ด๋•Œ ์—ฐ๊ฒฐํ•œ ํ•จ์ˆ˜๋Š” updateHeader func tableView(_ tableView: UITableView, viewForHeaderInSectio.. 2022. 8. 17.
[LeetCode] 704. Binary Search ๋ณดํ˜ธ๋˜์–ด ์žˆ๋Š” ๊ธ€ ์ž…๋‹ˆ๋‹ค. 2022. 8. 15.
[LeetCode] 724. Find Pivot Index pivot ์ธ๋ฑ์Šค๋ž€ ์ธํ…์Šค์˜ ๋ชจ๋“  ์™ผ์ชฝ ์š”์†Œ์˜ ํ•ฉ๊ณผ ์˜ค๋ฅธ์ชฝ์˜ ๋ชจ๋“  ์š”์†Œ์˜ ํ•ฉ์ด ๊ฐ™์€ ์ง€์ ์˜ ์ธ๋ฑ์Šค class Solution { func pivotIndex(_ nums: [Int]) -> Int { var rightSum = nums.reduce(0, +) - nums[0] var leftSum = 0 if rightSum == leftSum { return 0 } for index in 1.. ํ”ผ๋ด‡ ์ธ๋ฑ์Šค ๊ธฐ์ค€ ์™ผ์ชฝ ํ•ฉ, ์˜ค๋ฅธ ์ชฝ ํ•ฉ์„ ๊ตฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ „์ฒด ํ•˜์—์„œ ํ˜„์žฌ ์ธ๋ฑ์Šค ๊ฐ’์„ ๋นผ์คŒ if rightSum == leftSum { return 0 } ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค์—์„œ ์™ผ์ชฝ ํ•ฉ, ์˜ค๋ฅธ ์ชฝ ํ•ฉ์ด ๊ฐ™์€ ๊ฒฝ์šฐ ์ฒซ ๋ฒˆ์งธ ์ธ๋ฑ์Šค๊ฐ€ ํ”ผ๋ด‡ ์ธ๋ฑ์Šค ์ด๋ฏ€๋กœ 0์„ ๋ฆฌํ„ดํ•จ (์ธ๋ฑ์Šค 0์ด ํ”ผ๋ด‡ ์ธ๋ฑ์Šค) ์ „์ฒด ํ•ฉ S์—์„œ ํ˜„์žฌ.. 2022. 8. 1.