์ ์ฒด ๊ธ
swift5.5 ์ค๋ ๋ ๋์์ฑ ๋ฌธ์ ๋ฐ ํด๊ฒฐ ๋ฐฉ์ (async/await, Actor)
๋์์ฑ ๋ฌธ์ ๋ ์ฌ๋ฌ ์ค๋ ๋ ๋๋ ๋์์ ์คํ๋๋ ์ฝ๋๊ฐ ๊ณต์ ๋ ๋ฐ์ดํฐ์ ์ก์ธ์คํ ๋ ๋ฐ์ํ ์ ์์ต๋๋ค. ๋์์ฑ ๋ฌธ์ ์ ๋ํ์ ์ธ ์์๋ "๊ณ์ข ์ด์ฒด" ๋ฌธ์ ์ ๋๋ค. ๊ณ์ข ์ด์ฒด๋ฅผ ์๋ก ๋ค์ด ๋ณผ ์ ์์ต๋๋ค. ๋ ๊ฐ์ ๊ณ์ข A์ B๊ฐ ์๊ณ , A ๊ณ์ข์์ B ๊ณ์ข๋ก ์ผ์ ๊ธ์ก์ ์ด์ฒดํ๋ ์ํฉ์ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. class BankAccount { private(set) var balance: Int init(balance: Int) { self.balance = balance } func deposit(_ amount: Int) { balance += amount } func withdraw(_ amount: Int) { balance -= amount } } func transfer(from accountA..
modalPresentationStyle .fullScreen๊ณผ .overFullScreen์ ์ฐจ์ด์
modalPresentationStyle์ ๋ ๊ฐ์ง ์ต์ ์ค .fullScreen์ ๋ชจ๋ฌ ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ ์ ์ฒด ํ๋ฉด์ ์ฐจ์งํ๋ฉฐ, ๋ถ๋ชจ ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ ์์ ํ ์ฌ๋ผ์ง๋๋ค. ๋ค์ ๋งํด, ๋ชจ๋ฌ ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ ํ๋ฉด ์ ์ฒด๋ฅผ ์ฐจ์งํ์ฌ ๋ถ๋ชจ ๋ทฐ ์ปจํธ๋กค๋ฌ์ ์ฝํ ์ธ ๊ฐ ๋ณด์ด์ง ์์ต๋๋ค. ๋ฐ๋ฉด์, .overFullScreen์ ๋ชจ๋ฌ ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ ์ ์ฒด ํ๋ฉด์ ์ฐจ์งํ์ง๋ง, ๋ถ๋ชจ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ ์ฌ์ ํ ๋ณด์ด๋ฉฐ, ์ผ๋ถ ์ฝํ ์ธ ๊ฐ ์ฌ์ ํ ๋ณผ ์ ์์ต๋๋ค. ์ฆ, ๋ชจ๋ฌ ๋ทฐ ์ปจํธ๋กค๋ฌ๋ ์ ์ฒด ํ๋ฉด์ ์ฐจ์งํ์ง๋ง, ๋ถ๋ชจ ๋ทฐ ์ปจํธ๋กค๋ฌ์ ์ผ๋ถ ์ฝํ ์ธ ๊ฐ ์ฌ์ ํ ๋ณด์ด๋ฉฐ ๋ฐฐ๊ฒฝ์ ํฌ๋ช ํ๊ฒ ์ฒ๋ฆฌ๋ฉ๋๋ค. ๋ฐ๋ผ์, .fullScreen์ ๋ชจ๋ฌ ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ ์ ์ฒด ํ๋ฉด์ ์ฐจ์งํ๋ฉฐ, ๋ถ๋ชจ ๋ทฐ ์ปจํธ๋กค๋ฌ๊ฐ ์์ ํ ์ฌ๋ผ์ง๋ ๋ฐ๋ฉด์, .overFullScreen์ ๋ชจ๋ฌ ๋ทฐ ..
Swift 5.1 Static and class subscripts (SE-0254)
Swift 5.1์์๋ static ๋ฐ class subscript๊ฐ ๋์ ๋์ด ํด๋์ค ๋ฐ ๊ตฌ์กฐ์ฒด์์ ์๋ธ์คํฌ๋ฆฝํธ(Subscript)๋ฅผ ์ ์ํ ๋ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์๋ธ์คํฌ๋ฆฝํธ๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ปฌ๋ ์ , ๋ฆฌ์คํธ, ๋ฐฐ์ด ๋ฑ์ ์์์ ์ก์ธ์คํ๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์๋ธ์คํฌ๋ฆฝํธ๋ ์ธ์คํด์ค ๋ ๋ฒจ์์ ์ ์๋ฉ๋๋ค. ํ์ง๋ง Swift 5.1์์๋ static ๋ฐ class ์๋ธ์คํฌ๋ฆฝํธ๋ฅผ ์ ์ํ ์ ์๊ฒ ๋์์ต๋๋ค. Static subscript static subscript๋ ํด๋์ค๋ ๊ตฌ์กฐ์ฒด์ ํ์ ์์ฒด์์ ์ฌ์ฉํ ์ ์๋ ์๋ธ์คํฌ๋ฆฝํธ์ ๋๋ค. ์ฆ, ์ธ์คํด์ค ์์ด ํ์ ์์ฒด์์ ํธ์ถํ ์ ์์ต๋๋ค. static subscript๋ static ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํฉ๋๋ค. struct TimesTabl..
reason: 'Don't know about flushed view
iOS์์ addSubView ๋ฉ์๋๋ฅผ ํธ์ถ ํ ๋ ๋ฐ์ํฉ๋๋ค. ๋ทฐ ๊ณ์ธต ๊ตฌ์กฐ์์ ๋ทฐ๋ฅผ ์ฐพ์ง ๋ชปํ์ ๋ ๋ฐ์ํฉ๋๋ค. ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ์ด์ ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์ ๋๋ค. ์ถ๊ฐํ๋ ค๋ ์๋ธ๋ทฐ๊ฐ ๋ฉ๋ชจ๋ฆฌ์์ ํด์ ๋์๊ฑฐ๋, ์ด์ ์ ๋ค๋ฅธ ๋ทฐ์ ์ถ๊ฐ๋์์ ๊ฒฝ์ฐ, addSubView๋ฅผ ํธ์ถํ์ฌ ์ด๋ฏธ ์ ๊ฑฐ๋ ๋ทฐ๋ฅผ ์ถ๊ฐํ๋ ค๊ณ ์๋ํ๋ ๊ฒฝ์ฐ์ ๋๋ค. ์ถ๊ฐํ๋ ค๋ ๋ทฐ๊ฐ ์์ง ํ๋ฉด์ ํ์๋์ง ์์ ๊ฒฝ์ฐ์ ๋๋ค. ๋ทฐ๋ฅผ ์ถ๊ฐํ๊ธฐ ์ ์ ์ํผ ๋ทฐ์ ์ถ๊ฐํ์ฌ ๋ทฐ๋ฅผ ๋ณด์ด๊ฒ ํ๊ฑฐ๋ setNeedsDisplay ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๋ทฐ๋ฅผ ๋ค์ ๊ทธ๋ฆฌ๋๋ก ์ง์ ํด์ผํฉ๋๋ค. ์ถ๊ฐํ๋ ค๋ ๋ทฐ๊ฐ ์ํผ ๋ทฐ์ ์ด๋ฏธ ์๋ก ๋ค๋ฅธ ๊ณ์ธต ๊ตฌ์กฐ์ ์์ ๋ ๋ฐ์ํฉ๋๋ค. ๋ทฐ๋ฅผ ์๋ก ๋ค๋ฅธ ๋ทฐ ์ปจํธ๋กค๋ฌ์์ ์ฌ์ฉํ๊ฑฐ๋ ์ํผ ๋ทฐ์ ์๊ด์๋ ๋ทฐ๋ฅผ ๋ง๋ค๋ ค๋ ๊ฒฝ์ฐ์ ๋๋ค. ์ถ๊ฐํ๋ ค๋ ๋ทฐ..
๋ฐ์ฝ๋ ์ดํฐ ํจํด(Decorator Pattern)
๋ฐ์ฝ๋ ์ดํฐ ํจํด(Decorator Pattern)์ด๋? ๋ฐ์ฝ๋ ์ดํฐ ํจํด์ ๊ฐ์ฒด ์งํฅ ๋์์ธ ํจํด ์ค ํ๋๋ก, ๊ธฐ์กด์ ๊ฐ์ฒด์ ์๋ก์ด ๊ธฐ๋ฅ์ ๋์ ์ผ๋ก ์ถ๊ฐํ๊ธฐ ์ํ ํจํด์ ๋๋ค. ๋ฐ์ฝ๋ ์ดํฐ ํจํด์ ์ฌ์ฉํ๋ฉด, ๊ธฐ์กด ์ฝ๋๋ฅผ ์์ ํ์ง ์๊ณ ๋ ๊ฐ์ฒด์ ์ฑ ์๊ณผ ์ญํ ์ ํ์ฅํ ์ ์์ด ์ ์ฐ์ฑ์ด ๋์ ํจํด์ ๋๋ค. ๋ฐ์ฝ๋ ์ดํฐ ํจํด์ ๊ตฌ์ฑ์์ ๋ฐ์ฝ๋ ์ดํฐ ํจํด์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌ์ฑ๋ฉ๋๋ค. Component: ๋ฐ์ฝ๋ ์ดํฐ ํจํด์์ ์ถ๊ฐ ๊ธฐ๋ฅ์ ๋ถ์ฌํ ๊ฐ์ฒด์ ์ธํฐํ์ด์ค ์ญํ ์ ํฉ๋๋ค. ConcreteComponent: Component ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ฒด์ ๋๋ค. Decorator: Component ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ , ์ถ๊ฐ ๊ธฐ๋ฅ์ ๋ถ์ฌํ ๊ฐ์ฒด์ ์ถ์ ํด๋์ค์ ๋๋ค. ConcreteDecorator: Decorator ํด..
์ด๋ํฐ ํจํด(Adapter Pattern)
์ด๋ํฐ ํจํด์ ํธํ๋์ง ์๋ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ง ํด๋์ค๋ฅผ ํด๋ผ์ด์ธํธ์์ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋๋ ํจํด์ผ๋ก, ์ค์ ๋ก ๋ง์ ๊ฒฝ์ฐ์์ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. 1. ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค๊ฐ ํด๋ผ์ด์ธํธ์์ ์ฌ์ฉํด์ผ ํ๋ ์ธํฐํ์ด์ค์ ๋ค๋ฅผ ์ ์์ต๋๋ค. ์ด ๊ฒฝ์ฐ, ์ด๋ํฐ ํจํด์ ์ฌ์ฉํ์ฌ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํด๋ผ์ด์ธํธ์์ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๊ฒ ํฉ๋๋ค. // ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ธํฐํ์ด์ค class ExternalLib { func doSomethingComplicated() { // ... } } // ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉํ ์ธํฐํ์ด์ค protocol MyLib { func doSomethingSimple() } // ์ด๋ํฐ..
์์๋ณ์ ๋ถ๋ฆฌ (Split Temporary Variable)
์์ ๋ณ์ ๋ถ๋ฆฌ๋ ๋ฆฌํฉํ ๋ง ๊ธฐ๋ฒ ์ค ํ๋๋ก, ํน์ ํํ์์ด ๋ณต์กํ๊ฑฐ๋ ๊ธธ์ด์ ์ฝ๋ ๊ฐ๋ ์ฑ์ด ๋๋น ์ง๋ ๊ฒฝ์ฐ, ํด๋น ํํ์์ ์์ ๋ณ์๋ก ์ถ์ถํ์ฌ ๊ฐ๋ ์ฑ์ ๋์ด๋ ๊ธฐ๋ฒ์ ๋๋ค. ๋ค์์ Swift ์์ ์ฝ๋์ ๋๋ค. ๋ค์ ์ฝ๋๋ ํ์๋ค์ ์ํ ์ํ ์ฑ์ ์ ํ๊ท ๋ด๋ ํจ์์ ๋๋ค. ๊ธฐ์กด ์ฝ๋์์๋ ๋ฐฐ์ด์ ์์๋ค์ ๋ชจ๋ ๋ํ ๊ฐ์ ๋ณ์์ ํ ๋นํ์ฌ ๊ณ์ฐํ๊ณ ์์ต๋๋ค. func calculateAverageScore(scores: [Int]) -> Double { var totalScore = 0 for score in scores { totalScore += score } return Double(totalScore) / Double(scores.count) } ์ ์ฝ๋๋ฅผ ์์ ๋ณ์ ๋ถ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค. ๋จผ..
์ง๊ด์ ์์๋ณ์ ์ฌ์ฉ (Introduce Explaining Variable)
์ง๊ด์ ์์๋ณ์ ์ฌ์ฉ (Introduce Explaining Variable)์ ์์๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๋ณต์กํ ์์ด๋ ๊ณ์ฐ ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ๊ณ , ์ด๋ฅผ ์ดํดํ๊ธฐ ์ฌ์ด ์ด๋ฆ์ผ๋ก ๋ช ๋ช ํ์ฌ ๊ฐ๋ ์ฑ์ ๋์ด๋ ๋ฆฌํฉํ ๋ง ๊ธฐ๋ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ณด๊ฒ ์ต๋๋ค. func calculateTotalPrice(price: Double, count: Int) -> Double { var totalPrice = price * Double(count) if count > 10 { totalPrice *= 0.9 } return totalPrice } ์ ์ฝ๋์์ totalPrice๋ price์ count๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ์ฐ๋๋ฏ๋ก, ์ด๋ฅผ ์ดํดํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ง๊ด์ ์ธ ์์๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ ์ฑ์..