๋ชฉ๋กSWiFT (59)

Focus On Develop ๐ŸคŸ๐ŸคŸ

[RxSwift] RxSwift ์ž…๋ฌธํ•˜๊ธฐ

์‹œ๊ฐ„์ด ๊ฐˆ์ˆ˜๋ก ์ ์  RxSwift๋Š” ๊ผญ ์•Œ์•„์•ผ ํ•˜๋Š” ํŠธ๋ Œ๋“œ์ฃ ~~?ใ…Žใ…Ž Apple์—์„œ๋„ Rx+MVVM Base์ธ SwiftUI๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์ ์  ์ง€ํ–ฅํ•˜๋Š” ๊ฒƒ ๊ฐ™๊ณ ์š” ใ…Žใ…Ž (๊ฐœ์ธ์ ์ธ ์ƒ๊ฐใ…‹) ์—…๋ฌด๋ฅผ ํ•˜๋ฉด์„œ๋Š” ์ ‘ํ•ด๋ณผ ๊ธฐํšŒ๊ฐ€ ์—†์–ด์„œ, ํ˜ผ์ž ๋”ฐ๋กœ๋ผ๋„ ํ•œ๋ฒˆ ๊ณต๋ถ€ํ•˜๋ฉด์„œ "์ ์–ด๋„ ๊ฐœ๋…์ •๋„๋Š” ์•Œ๊ณ  ๊ธฐ๋ณธ์ •๋„๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ๊ฒ ๋‹ค" ํ•ด์„œ ์‹œ์ž‘ํ•ด๋ณด๋ ค๊ณ  ํ•ด์š”!! ๐Ÿ˜Ž ๊ทธ๋งŒํผ ์™•์ดˆ๋ณด๋ฅผ ์œ„ํ•œ ์ž…๋ฌธ์šฉ ํฌ์ŠคํŒ…์ด ๋˜๊ฒ ์ง€๋งŒ, ํ•ต์‹ฌ ๊ฐœ๋…์ด๋‚˜ ์›๋ฆฌ๋Š” ์˜ˆ์ œ์™€ ํ•จ๊ป˜ ์ƒ์„ธํžˆ ๋‹ค๋ค„๋ณผ ์˜ˆ์ •์ด๋ผ ์กฐ๊ธˆ์€ ๊ธด ํฌ์ŠคํŒ…์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!! ๐Ÿ˜ญ ๊ทธ์น˜๋งŒ! ์ด ํฌ์ŠคํŒ…์„ ์ฒœ์ฒœํžˆ๋ผ๋„ ์™„์ฃผํ•˜์‹ ๋‹ค๋ฉด RxSwift์— ๋Œ€ํ•œ ๊ฐœ๋…์ด๋‚˜ ๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฒ•์€ ์ตํžˆ์‹ค ์ˆ˜ ์žˆ์„๊ฑฐ์—์š” ๐Ÿง‘‍๐Ÿ’ป RxSwift์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๊ธฐ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—, ๊ธฐ๋ณธ์ ์ธ Swift์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ..

[Swift] Class vs Struct

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ๋งค์šฐ ๊ธฐ๋ณธ์ด๋ฉด์„œ๋„, ๋งค์šฐ ์ค‘์š”ํ•œ Class์™€ Struct์— ๋Œ€ํ•ด์„œ ์ข€ ์‚ดํŽด๋ณด๋ ค๊ณ  ํ•ด์š”! ๋Œ์•„๋ณด๋‹ค ๋ณด๋‹ˆ, ์ด๋Ÿฐ Swift์— ๋Œ€ํ•ด ๊ธฐ๋ณธ์ด์ง€๋งŒ ๋งค์šฐ ์ค‘์š”ํ•œ ๋‚ด์šฉ๋“ค์„ ๋”ฐ๋กœ ๋‹ค๋ฃจ์ง€ ์•Š์•˜๋˜ ๊ฒƒ ๊ฐ™์•„์„œ ์ข€ ๋‹ค๋ฃจ๋ ค๊ณ ์š”!! ๐Ÿง‘‍๐Ÿ’ป ๋จผ์ € Struct์™€ Class๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž„์˜๋กœ ๋งŒ๋“  "๋ฐ์ดํ„ฐ ํƒ€์ž…"์ด์—์š”. ๋ฐ์ดํ„ฐ๋ฅผ ํŠน์ • ์šฉ๋„์— ๋งž๊ฒŒ ๋ฌถ์–ด ํ‘œํ˜„ํ•˜๊ณ ์ž ํ• ๋•Œ, ๋‚ด๋ถ€์—์„œ ํ”„๋กœํผํ‹ฐ์™€ ๋ฉ”์†Œ๋“œ๋ฅผ ์ •์˜ํ•ด์„œ ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ๋  ์ˆ˜ ์žˆ์–ด์š”. ๋จผ์ € ๊ฐ„๋žตํ•˜๊ฒŒ ๊ณตํ†ต์ ๊ณผ ์ฐจ์ด์ ์„ ์š”์•ฝํ•ด๋ณด๊ณ , ์ค‘์š”ํ•œ ์ฐจ์ด์ ์— ๋Œ€ํ•ด์„œ๋Š” ์ข€ ๋” ์‚ดํŽด๋ณผ๊ฒŒ์š”! ๊ณตํ†ต์  ๊ฐ’์„ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•œ ํ”„๋กœํผํ‹ฐ ์ •์˜ ๊ฐ€๋Šฅ ๊ธฐ๋Šฅ ์‹คํ–‰์„ ์œ„ํ•œ ๋ฉ”์†Œ๋“œ ์ •์˜ ๊ฐ€๋Šฅ initializer(์ƒ์„ฑ์ž) ์ •์˜ ๊ฐ€๋Šฅ extension ์„ ํ†ตํ•œ ํ™•์žฅ ๊ฐ€๋Šฅ protocol ์ฑ„ํƒ ๊ฐ€๋Šฅ..

[Swift] Singleton Pattern (์‹ฑ๊ธ€ํ†ค ํŒจํ„ด)

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

[Swift] FileManager

์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” swift์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” FileManager๋ผ๋Š” ํด๋ž˜์Šค๋ฅผ ์ด์šฉํ•ด์„œ, ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ  ๋ถˆ๋Ÿฌ์˜ค๊ณ , ์‚ญ์ œํ•˜๋Š” ๊ฑธ ํ•ด๋ณด๋ ค๊ณ  ํ•ด์š”. ์ผ๋ฐ˜์ ์œผ๋กœ ๋กœ์ปฌ์— ์ด๋ฏธ์ง€, ์Œ์›, ํ…์ŠคํŠธ ๋“ฑ ํŒŒ์ผ์„ ์ €์žฅํ–ˆ๋‹ค ๋ถˆ๋Ÿฌ์™”๋‹ค ํ• ๋•Œ๋Š” FileManager๋ฅผ ํ†ตํ•ด ๋กœ์ปฌ์— ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ , ํŒŒ์ผ ๊ฒฝ๋กœ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ CoreData ๋“ฑ์„ ํ†ตํ•ด์„œ ๊ด€๋ฆฌํ•˜์ฃ . ์ด ์ค‘์— ๋กœ์ปฌ์— ํŒŒ์ผ์„ ์ €์žฅํ•˜๋Š” ๋‹จ๊ณ„๋ฅผ ํ•ด๋ณด๋ ค๊ณ  ํ•ด์š”! ๋ฐ”๋กœ ์‹œ์ž‘ํ• ๊ป˜์š”! File Domain ๋จผ์ € macOS, iOS ๋“ฑ apple์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ domain์œผ๋กœ ํŒŒ์ผ๋“ค์˜ ์œ„์น˜๋ฅผ ๊ฒฐ์ •ํ•ด์š”. ์ด domain์€ ๊ธฐ๋ณธ์ ์œผ๋กœ user, local, network, system 4๊ฐœ์˜ domain์„ ์ œ๊ณตํ•ด์š”. ์•„๋ž˜ ๊ทธ๋ฆผ์ฒ˜๋Ÿผ์š”! ์˜ˆ๋ฅผ ๋“ค๋ฉด, ํ„ฐ๋ฏธ๋„์„ ์—ด๋ฉด ์ตœ์ƒ..

[Swift] Audio Recording

์˜ค๋Š˜์€ Swift์—์„œ AVAudioRecorder ๋ฅผ ํ™œ์šฉํ•œ ๋…น์Œ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๊ณต๋ถ€ํ•ด๋ณด๋ ค๊ณ  ํ•ด์š”! ๋จผ์ € ๋…น์Œ๋œ ํŒŒ์ผ์„ ๋กœ์ปฌ ๊ฒฝ๋กœ์— ์ €์žฅํ•˜๊ณ , ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ณผ์ •์ด ์žˆ์œผ๋‹ˆ FileManager๋ฅผ ๋จผ์ € ๋ณด์‹œ๊ธธ ์ถ”์ฒœ๋“œ๋ ค์š” ๐Ÿ˜Ž ๋จผ์ € Swift์—์„œ ๋ฏธ๋””์–ด(์˜์ƒ, ์˜ค๋””์˜ค ๋“ฑ)์„ ๋‹ค๋ฃฐ๋•Œ๋Š” AVFoundation๋ฅผ ํ™œ์šฉํ•ด์„œ ๋Œ€๋ถ€๋ถ„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋””์˜ค์™€ ๊ด€๋ จ๋œ ์‚ฌํ•ญ์€ AVAudioRecord, AVAudioPlayer, AVAudioSession, AVAudioEngine ๋“ฑ๋“ฑ ๋งŽ์€ ํด๋ž˜์Šค๋กœ ์ง€์›์„ ํ•ด์ค˜์š”. AVFoundation์„ importํ•˜๊ณ  ์‹œ์ž‘ํ•ด์ฃผ์„ธ์š”~! ๋จผ์ € ๋…น์Œ์„ ์œ„ํ•ด์„œ ์˜ค๋””์˜ค ์„ธ์…˜์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ‘‰ AVAudioSession ์˜ค๋””์˜ค ์„ธ์…˜์„ ํ†ตํ•ด ๋…น์Œ/์žฌ์ƒ ๋“ฑ์— ๋Œ€ํ•œ ๊ถŒํ•œ, ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋…น์Œ์ธ์ง€, ์–ด๋–ค ๋งˆ์ดํฌ๋ฅผ ์‚ฌ..

[Swift] typealias

typealias๋Š”.. ์–ด๋””์„œ ๋งŽ์ด ๋ณธ ๋“ฏ ํ•˜๊ณ , ์‹ค์ œ๋กœ ์†Œ์Šค๋ฅผ ๋ณด๋ฉด ์—ฌ๊ธฐ ์ €๊ธฐ ๋˜๊ฒŒ ๋งŽ๋”๋ผ๊ณ ์š”! ๊ทธ๋ƒฅ ๋Š๋‚Œ์ ์œผ๋กœ ์•„~ ์ด๊ฒŒ ํƒ€์ž…์„ ์žฌ์ •์˜ํ•˜๋Š”๊ฑฐ๊ตฌ๋‚˜~ ํ•˜๊ณ  ์ดํ•ดํ•˜๊ณ  ๋„˜์–ด๊ฐ”์—ˆ๋Š”๋ฐ์š”! ๊ทธ๋ž˜์„œ ์˜ค๋Š˜์€ ๊ฐ„๋‹จํ•˜๊ฒŒ๋‚˜๋งˆ ์ •๋ฆฌ๋ฅผ ํ•ด๋†“์œผ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค ๐Ÿ’ typealias ๊ธฐ์กด์— ์ •์˜๋˜์–ด์žˆ๋Š” ์–ด๋–ค ํƒ€์ž…์„ ์žฌ์ •์˜ํ•ด์„œ ์ฝ”๋“œ๋ฅผ ๋” ์ฝ๊ธฐ ์‰ฝ๊ณ , ์ดํ•ดํ•˜๊ธฐ ์‰ฝ๋„๋ก ๋ช…ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค! ใ…‹ใ…‹ ์˜ˆ๋ฅผ๋“ค๋ฉด ์นœ๊ตฌ ๋ถ€๋ฅผ๋•Œ, ๋ณ„๋ช…์„ ์ง€์–ด์ฃผ๊ณ  ํŽธํ•˜๊ฒŒ ๋ณ„๋ช…๋ถ€๋ฅด๋Š” ๊ฒƒ๊ณผ ๋˜‘๊ฐ™์•„์š” ๐Ÿ˜‚๐Ÿ˜‚ ์ด๋ฆ„๊ณผ ๋ณ„๋ช…์œผ๋กœ ์ƒ๊ฐํ•ด๋ณด๋ฉด, ๊ธฐ๋ณธ์ ์ธ ๋ฌธ๋ฒ•์€ ์•„๋ž˜์™€ ๊ฐ™์•„์š”! typealias ๋ณ„๋ช… = ์›๋ž˜์ด๋ฆ„ ๋ฐ”๋กœ ๋ช‡๊ฐ€์ง€ ์˜ˆ์‹œ๋ฅผ ํ†ตํ•ด์„œ ์‚ดํŽด๋ณผ๊ฒŒ์š”! typealias Name = String var name: Name var nickName: String String์ด๋ผ๋Š” ํƒ€..