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

์ „์ฒด ๊ธ€40

[iOS] iOS Concurrency - 1. GCD/Operation, ๋™๊ธฐ/๋น„๋™๊ธฐ, ์ง๋ ฌ/๋™์‹œ Inflearn: iOS Concurrency ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐ•์˜ ์ •๋ฆฌ 1. GCD/Operation์— ์•ž์„œ 1) ์™œ ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ํ•„์š”ํ• ๊นŒ? ์“ฐ๋ ˆ๋“œ : ์ผํ•˜๋Š” ๋…€์„๋“ค : ์•„์ดํฐ 11ํ”„๋กœ 6์ฝ”์–ด ( ์ผ์„ํ•˜๋Š” ๋…€์„์ด 6๊ฐœ๊ฐ€ ๋‹ฌ๋ ค์žˆ๋‹ค, ๋ช‡๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ๊ฐ€ ์žˆ๋Š”์ง€๋Š” ์•Œ๋ ค์ง€์ง€ ์•Š์Œ ๋Œ€๋žต 12๊ฐœ ์ด์ƒ ์ •๋„) ์•„์ดํฐ์€ 16๋ฐ€๋ฆฌ์˜ 1์ดˆ๋งˆ๋‹ค ๊ต‰์žฅํžˆ ๋น ๋ฅด๊ฒŒ ๋ฆฌํ”„๋ ˆ์‹ฑ์„ ํ•˜๋Š”๋ฐ ๊ทธ ์ž‘์—…์„ ๋ฌด์–ธ๊ฐ€๊ฐ€ ๋ฐฉํ•ดํ•˜๊ณ  ์žˆ์–ด์„œ ์˜์ƒ์ฒ˜๋Ÿผ ๋ฒ„๋ฒ…์ด๋Š” ํ˜„์ƒ ๋ฐœ์ƒํ•œ๋‹ค! ์•„์ดํฐ์€ ์ผํ•˜๋Š” ๋…€์„์ด ์—ฌ๋Ÿฟ์ธ๋ฐ ์™œ ๋ฒ„๋ฒ…์˜€๋Š”๊ฐ€? ๐Ÿ’ก → ํ•œ๊ฐœ์˜ ์“ฐ๋ ˆ๋“œ์—์„œ๋งŒ ์ผ์„ ์‹œ์ผฐ๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„๋ฒ…์ธ ๊ฒƒ. cmd + 7 ๋ˆ„๋ฅด๋ฉด ์œ„์ฒ˜๋Ÿผ ์–ด๋–ค ์Šค๋ ˆ๋“œ๊ฐ€ ์ผํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธ ๊ฐ€๋Šฅ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์ž˜๋ชปํ•ด์„œ ์šฐ์—ฐ์ฐฎ๊ฒŒ ํ™”๋ฉด์„ ๊ด€๋ฆฌํ•˜๋Š” ํ•œ ๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋งŒ ๊ณ„์† ์‚ฌ์šฉํ•ด์„œ ๋ฒ„๋ฒ…์ด๊ฒŒ ๋จ ๊ทธ๋™์•ˆ์—๋Š” ์šฐ๋ฆฌ๊ฐ€.. 2023. 2. 11.
[GitHub] PR, Issue ํ…œํ”Œ๋ฆฟ ๋„ฃ๊ธฐ ํŽธ๋ฆฌํ•œ github ํ˜‘์—…์„ ์œ„ํ•ด์„œ ๋‘๊ณ ๋‘๊ณ  ์“ธ pr๊ณผ issue ํ…œํ”Œ๋ฆฟ ๋„ฃ๋Š” ๋ฐฉ๋ฒ•์„ ๋น ๋ฅด๊ฒŒ ์‡ฝ์‚ญ ์•Œ์•„๋ด…์‹œ๋‹ค. Issue ํ…œํ”Œ๋ฆฟ ๋„ฃ๊ธฐ ์ด์Šˆํ…œํ”Œ๋ฆฟ์€ github ์›๊ฒฉ ๋ ˆํฌ์—์„œ ํŽธ๋ฆฌํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 1. Settings ๋“ค์–ด๊ฐ€๊ธฐ ํ…œํ”Œ๋ฆฟ ์„ค์ •์„ ์›ํ•˜๋Š” repository์˜ settings์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. 2. Set up templates ํด๋ฆญ ์Šคํฌ๋กค์„ ๋‚ด๋ ค Features - Issues - Set up templates ์ดˆ๋ก์ƒ‰ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์ค๋‹ˆ๋‹ค. 3. ์›ํ•˜๋Š” ํ…œํ”Œ๋ฆฟ ์ข…๋ฅ˜ ์„ ํƒ ์—ฌ๋Ÿฌ ์ข…๋ฅ˜์˜ ํ…œํ”Œ๋ฆฟ์„ ๋งŒ๋“ค์–ด ๋‘๋ฉด ์ด์Šˆ๋ฅผ ์ƒ์„ฑ ํ•  ๋•Œ ์ด์Šˆ์˜ ์ข…๋ฅ˜์— ๋”ฐ๋ผ ๋งž๋Š” ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 4. ํ…œํ”Œ๋ฆฟ ์ž‘์„ฑ feature request๋ฅผ ์„ ํƒํ•˜์˜€๊ณ  preview and edit ์„ ๋ˆŒ๋Ÿฌ์ค๋‹ˆ๋‹ค. ์ˆ˜์ •์„ ์œ„ํ•ด ์—ฐ.. 2023. 2. 10.
[iOS] Rx์—†์ด ๊ตฌํ˜„ํ•˜๋Š” MVVM๊ธฐ์ดˆ MVVM ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋ฒ„(API)์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ํ…Œ์ด๋ธ” ๋ทฐ์— ํ‘œ์‹œํ•˜๋Š” ์˜ˆ์ œ ์„œ๋ฒ„์—์„œ ์ง์› ๋ฐ์ดํ„ฐ ๋ชฉ๋ก์— ๋Œ€ํ•œ ๋ฆฌ์Šคํฐ์Šค(response)๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์ด ๋ชฉ๋ก์„ ํ…Œ์ด๋ธ” ๋ทฐ์— ํ‘œ์‹œํ•œ๋‹ค. MVVM ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ฐœ์š”์™€ ์—ญํ•  ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ (View Controller): UI ๊ด€๋ จ ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ •๋ณด ํ‘œ์‹œ ๋ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ๋“ฑ์˜ ์ž‘์—…์ด ์žˆ๋‹ค. ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋ทฐ ๋ ˆ์ด์–ด์˜ ์ผ๋ถ€์ด๋‹ค. ๋ทฐ๋ชจ๋ธ (View Model): ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋กœ๋ถ€ํ„ฐ ์ •๋ณด๋ฅผ ์ˆ˜์‹ ํ•˜๊ณ  ์ด ๋ชจ๋“  ์ •๋ณด๋ฅผ ์ฒ˜๋ฆฌํ•œ ๋’ค ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๋กœ ๋‹ค์‹œ ๋ณด๋‚ธ๋‹ค. ๋ชจ๋ธ (Model): MVC์—์„œ์™€ ๊ฐ™์€ ๋ชจ๋ธ์ด๋‹ค. ๋ทฐ๋ชจ๋ธ์ด ์‚ฌ์šฉํ•˜๊ณ  ๋ทฐ๋ชจ๋ธ์ด ์ƒˆ ์—…๋ฐ์ดํŠธ ์ •๋ณด๋ฅผ ๋ณด๋‚ผ ๋•Œ๋งˆ๋‹ค ๋ชจ๋ธ๋„ ์—…๋ฐ์ดํŠธํ•œ๋‹ค. ์˜ˆ์ œ ๋™์ž‘ ๋ฐฉ์‹ ๋ทฐ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ๋ทฐ๋Š” ๋ทฐ ๋ชจ๋ธ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ .. 2023. 2. 9.
[iOS] UIButton.Configuration ์‚ฌ์šฉํ•ด๋ณด๊ธฐ SNS ๋กœ๊ทธ์ธ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค private let kakaoLoginButton = UIButton().then{ $0.setImage(UIImage(named: "img_logo_kakao"), for: .normal) $0.backgroundColor = UIColor.kakaoyellow $0.setTitle("์นด์นด์˜ค๋กœ ๊ณ„์†ํ•˜๊ธฐ", for: .normal) $0.setTitleColor(UIColor.snslogoblack, for: .normal) $0.titleLabel?.font = UIFont.hanSansBoldFont(ofSize: 16) $0.clipsToBounds = true $0.layer.cornerRadius = 10 } ์Œ ์ด๋ฏธ์ง€์™€ ๊ธ€์”จ ์‚ฌ.. 2023. 2. 7.
[iOS] ์ œํ”Œ๋ฆฐ์—์„œ Xcode ์ปฌ๋Ÿฌ์—์…‹ ๋ฐ”๋กœ ์ถ”์ถœ ์ œํ”Œ๋ฆฐ์—์„œ ๋งŒ๋“ค์–ด ์ค€ swift UIColor Extension ์ฝ”๋“œ ๊ธ์–ด๋‹ค๊ฐ€ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•ด์ฃผ๋ฉด ์ƒ‰์ƒ์ด ์ถ”๊ฐ€๋œ๋‹ค.! ํ•˜์ง€๋งŒ ์ฝ”๋“œ๋งŒ ์žˆ๊ณ  ๋ฌด์Šจ ์ƒ‰์ธ์ง€ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋Š” ์–ด๋ ต๋‹ค ๐Ÿฅฒ ๋”ฐ๋ผ์„œ ์•„๋ž˜์ฒ˜๋Ÿผ ์—์…‹์นดํƒˆ๋กœ๊ทธ์—๋„ Color Asset์ถ”๊ฐ€ํ•ด์„œ ์ƒ‰์ƒ ๋ฏธ๋ฆฌ ๋ณด๋ฉด์„œ ์“ฐ๊ณ  ์‹ถ๋‹ค๋ฉด ~!? ์˜ค๋ฅธ์ชฝ ์œ„์— ์žˆ๋Š” Export ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์ค€๋‹ค ! ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ํ”„๋กœ์ ํŠธ์˜ .xcassets ํŒŒ์ผ ๊ฒฝ๋กœ๋ฅผ ์„ ํƒํ•˜๊ณ  Export ๋ฒ„ํŠผ ๋ˆŒ๋Ÿฌ์ฃผ๋ฉด ๋! ์Šค๋ณด์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹น 2023. 2. 5.
[iOS] ์Šคํฌ๋กค ์‹œ ํšŒ์ƒ‰์„  ๋‚˜ํƒ€๋‚˜๊ฒŒ ํ•˜๊ธฐ CollectionView๊ฐ€ ์Šคํฌ๋กค ๋˜๋Š”์ง€ ํŒŒ์•… ํ•ด์„œ ํŠน์ • ๋ทฐ๋ฅผ ๋„์šฐ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค! ์ € ๊ฐ™์€ ๊ฒฝ์šฐ์—๋Š” ํ•˜๋‹จ ์Šคํฌ๋กค์‹œ์— ๊ณ ์ •๋˜์–ด์žˆ๋Š” ์ƒ๋‹จ ๋กœ๊ณ ๋ทฐ์™€ ์Šคํฌ๋กค ๋˜๋Š” ์˜์—ญ ์‚ฌ์ด์˜ ํšŒ์ƒ‰์„ ์ด ๋‚˜ํƒ€๋‚˜๋„๋ก ํ•˜๋Š” ํ•˜๋‹จ๊ณผ ๊ฐ™์€ ๋ทฐ๋ฅผ ๊ตฌํ˜„ํ–ˆ์–ด์•ผํ–ˆ๋Š”๋ฐ์š”! ์ฒ˜์Œ์— ํŒฌ์ œ์Šค์ฒ˜๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ธ๊ฐ€ ๊ณ ๋ฏผํ–ˆ์ง€๋งŒ ์ •๋ง ์ƒ๊ฐ๋ณด๋‹ค ์‰ฌ์šด ์ž‘์—…์ด์—ˆ์Šต๋‹ˆ๋‹ค. 1. CollectionvView๋ฅผ ๊ฐ€์ง€๊ณ ์žˆ๋Š” ViewController๊ฐ€ UIScrollViewDelegate๋ฅผ ์ฑ„ํƒ ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. extension MainViewController: UIScrollViewDelegate{ } 2. scrollViewDidScroll ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•ด์ค๋‹ˆ๋‹ค. ์Šคํฌ๋กค์‹œ์— ๋‚ด๋ถ€์ ์œผ๋กœ ํ˜ธ์ถœ ๋˜๋Š” ํ•จ์ˆ˜์ธ func scrollViewDidScroll(_ scr.. 2023. 2. 2.
[Swift] ์Šค์œ„ํ”„ํŠธ ์ง„๋ฒ• ๋ณ€ํ™˜ํ•˜๊ธฐ let DecimalToThree = String(n,radix: 3)//10์ง„๋ฒ• ์ˆซ์ž๋ฅผ 3์ง„๋ฒ• ์ˆซ์ž๋กœ ๋ณ€ํ™˜ let ThreeToDecimal = Int(DecimalToThree,radix:3)! //3์ง„๋ฒ• ์ˆซ์ž๋ฅผ 10์ง„๋ฒ• ์ˆซ์ž๋กœ ๋ณ€ํ™˜ String์˜ init(_:radix:) ํ•จ์ˆ˜๋ฅผ ์“ฐ๋ฉด 10์ง„๋ฒ• ์ˆซ์ž๋ฅผ ์›ํ•˜๋Š” ์ง„๋ฒ• ์ˆซ์ž๋กœ ๋ณ€ํ™˜ ํ•ด์ค€๋‹ค! ๋ฐ˜๋Œ€๋กœ Int์˜ init(_:radix:)ํ•จ์ˆ˜๋ฅผ ์“ฐ๋ฉด ํ•ด๋‹น ์ง„๋ฒ•์„ 10์ง„๋ฒ• ์ˆซ์ž๋กœ ๋ณ€ํ™˜ ํ•ด ์ค€๋‹ค. 2023. 1. 25.
[Swift] ํŠœํ”Œ๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด ์กฐ๊ฑด ๋„ฃ์–ด์„œ ์ •๋ ฌํ•˜๊ธฐ var arrFailRate = [(rate:Double,stage:Int)]() //์ค‘๊ฐ„ ์ฝ”๋“œ ์ƒ๋žต for i in 0.. $1.rate) || ($0.stage < $1.stage) }) ์œ„์™€ ๊ฐ™์ด ํ•˜๋ฉด ํŠœํ”Œ๋“ค๋กœ ์ด๋ฃจ์–ด์ ธ์žˆ๋Š” ๋ฐฐ์—ด ๋‚ด๋ถ€์—์„œ rate๊ฐ’ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ๋กœ ์ •๋ ฌ๋œ ํ›„ rate๊ฐ€ ๊ฐ™์œผ๋ฉด stage๊ฐ’์ด ์˜ค๋ฆ„์ฐจ์ธ ์ˆœ์„œ๋กœ ์ •๋ ฌ ๋œ๋‹ค. 2023. 1. 24.
[iOS] navigationController.present()๋ฅผ ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? print(navigationController.viewControllers) // [HomeVC,FriendsListVC] guard let vc = UIStoryboard(name: "FriendsAdd", bundle: nil).instantiateViewController(withIdentifier: FriendsAddVC.identifier) as? FriendsAddVC else { return } vc.modalPresentationStyle = .fullScreen navigationController.present(vc, animated: true) print(navigationController.viewControllers)// [HomeVC,FriendsListVC] navigatio.. 2023. 1. 6.
[Swift] guard๋ฌธ ์•Œ์•„๋ณด๊ธฐ(guard let๊ณผ if let์˜ ์ฐจ์ด์  ๊นŒ์ง€) ์•„๋ฌด ์ƒ๊ฐ ์—†์ด ์˜ต์…”๋„ ๋ฒ—๊ธธ ๋•Œ ์ผ๋˜ ๊ทธ๋™์•ˆ ๋‘๋ฃจ๋ญ‰์ˆ ํ•˜๊ฒŒ ์•Œ๋˜ guard๋ฌธ์„ ๋ฟŒ์…” ๋ด…์‹œ๋‹ค. guard๋ฌธ guard ๋ฌธ์€ if๋ฌธ๊ณผ switch๋ฌธ์ฒ˜๋Ÿผ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ฒ˜๋ฆฌ ํ•  ๋•Œ ์“ฐ์ด๋Š” ์กฐ๊ฑด๋ฌธ ๋ฌธ๋ฒ•์ž…๋‹ˆ๋‹ค! guard ๋ฌธ์€ ์–ด๋– ํ•œ ์กฐ๊ฑด์„ ๊ฒ€์‚ฌํ•˜๊ณ  guard ๋ฌธ ๋ฐ‘์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ• ์ง€ ๋ง์ง€ ๊ฒฐ์ •ํ•˜๋Š” ์กฐ๊ฑด๋ฌธ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉด ์‰ฌ์šธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. if๋ฌธ์€ else๋ฌธ ์—†์ด๋„ ์“ธ ์ˆ˜ ์žˆ์ง€๋งŒ guard ๋ฌธ์€ ๋ฌด์กฐ๊ฑด else ๋ฌธ์„ ๊ฐ€์ง€๊ณ  ์ด else๋ฌธ ์•ˆ์—์„œ๋Š” ๋ฌด์กฐ๊ฑด return์œผ๋กœ ์ข…๋ฃŒ ์‹œํ‚ต๋‹ˆ๋‹ค. ์ •๋ฆฌํ•˜๋ฉด, guard ๋ฌธ์— ์ฃผ์–ด์ง„ ์กฐ๊ฑด๋ฌธ์ด ์ฐธ์ด๋ฉด ๋ฌธ์ œ ์—†์ด ๋ฐ‘์— ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ๊ฑฐ์ง“์ผ ๋•Œ, ์—ฌ๊ธฐ์— ํ•ญ์ƒ ๋‹ฌ๋ ค์žˆ๋Š” else๋ฌธ ์ฝ”๋“œ ๋ถˆ๋Ÿญ์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. guard๋Š” '๋น ๋ฅธ ์ข…๋ฃŒ'๊ฐ€ ํ•ต์‹ฌ ํ‚ค์›Œ๋“œ ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์›ํ•˜๋Š”.. 2023. 1. 5.