iOS 17์์ SwiftUI์ ์๋ก์ด ๊ธฐ๋ฅ์ ๋ฌด์์ผ๊น์?
์ถ์ฒ : ํด ํ๋์จ , 2023๋ 6์ 16์ผ ์์ฑ
2023๋
์๋ SwiftUI๊ฐ ์ง์์ ์ผ๋ก ๋ฐ์ ํ๋ฉฐ ๊ณ ๊ธ ์คํฌ๋กค ๋ทฐ ํจ๊ณผ, ์ปจํ
์ด๋ ์๋ ํฌ๊ธฐ ์กฐ์ , Metal ์
ฐ์ด๋ ์ง์ ๋ฑ ๋ง์ ์์ฒญ ๊ธฐ๋ฅ์ ํฌํจํ ๋๊ท๋ชจ ์
๋ฐ์ดํธ๊ฐ ์ด๋ฃจ์ด์ก์ต๋๋ค. ์ด๋ฒ ์
๋ฐ์ดํธ์์ ๊ฐ์ธ์ ์ผ๋ก ์์ฒญํ ๊ธฐ๋ฅ๋ค๋ก๋ Metal ์
ฐ์ด๋ ์ถ๊ฐ, Color๋ฅผ Codable๊ณผ ๋ ์ ํธํ๋๊ฒ ๋ง๋๋ ๊ธฐ๋ฅ, ์ ๋๋ฉ์ด์
์๋ฃ ์ ํด๋ก์ ์คํ, ๊ทธ๋ผ๋ฐ์ด์
์ ๋๋ฉ์ด์
, ์ง์ฌ๊ฐํ์ ๋ชจ์๋ฆฌ๋ฅผ ์ ํ์ ์ผ๋ก ๋ฅ๊ธ๊ฒ ๋ง๋๋ ๊ธฐ๋ฅ ๋ฑ์ด ์์ต๋๋ค. ์ด๋ฌํ ๊ฐ์ ์ฌํญ์ ๋ํ ์ฌ์ฉ์ ํผ๋๋ฐฑ์ผ๋ก ์ต์ 12๊ฐ ์ด์์ ํผ๋๋ฐฑ์ ๋ซ์์ต๋๋ค. SwiftUI๋ ๋น ๋ฅด๊ฒ ๋ฐ์ ํ๊ณ ์์ผ๋ฉฐ ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์์ต๋๋ค.
์คํฌ๋กค ๋ทฐ ๊ฐ์ ์ฌํญ
- ScrollView๋ฅผ ํ์ด์ง ๋๋ ์์ ๋ทฐ ์ฌ์ด๋ก ์ค๋ ํ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ
- ScrollView ํด๋ฆฌํ ๋นํ์ฑํํ์ฌ ๋ด์ฉ์ด ๋์น๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ
- ScrollView๋ฅผ ํ๋จ์์ ์์ํ๊ฒ ๋ง๋๋ ๋ฐฉ๋ฒ
- ScrollView์์ ์ฝํ ์ธ ๋๋ ์คํฌ๋กค ์ธ๋์ผ์ดํฐ๋ฅผ ๋ค์ฌ์ฐ๋ ๋ฐฉ๋ฒ
- ์ฌ์ฉ์ ์ ์ ์ ํ์ผ๋ก ๋ทฐ ์คํฌ๋กคํ๋ ๋ฐฉ๋ฒ
- ScrollView ๋๋ List์ ์คํฌ๋กค ๋ฐ ์ธ๋์ผ์ดํฐ๋ฅผ ๊น๋ฐ์ด๊ฒ ํ๋ ๋ฐฉ๋ฒ
- ์์ง ํ์ด์ง ์คํฌ๋กค ํ์ฑํํ๋ ๋ฐฉ๋ฒ
๊ทธ๋ฆผ ๋ฐ ์ ๋๋ฉ์ด์ ๊ฐ์ ์ฌํญ
- SwiftUI ๋ทฐ์ ๋ ์ด์ด ํจ๊ณผ๋ฅผ ์ฌ์ฉํ์ฌ Metal ์ ฐ์ด๋ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ
- ๋ทฐ์ ํฌ๊ธฐ ๋ฐ ์์น์ ๋ฐ๋ผ ๋ทฐ์ ๋ชจ์์ ๋์ ์ผ๋ก ์กฐ์ ํ๋ ๋ฐฉ๋ฒ
- SF Symbols ์ ๋๋ฉ์ด์ ํ๋ ๋ฐฉ๋ฒ
- ์ ๋๋ฉ์ด์ ์๋ฃ ์ ์๋ฃ ์ฝ๋ฐฑ ์คํํ๋ ๋ฐฉ๋ฒ
- ๋จ๊ณ๋ณ ์ ๋๋ฉ์ด์ ์ ์์ฑํ๊ธฐ ์ํด ๋จ๊ณ ์ ๋๋ฉ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
- ์๋ก์ด ๋ชจ์์ ๋ง๋ค๊ธฐ ์ํด ๋ชจ์์ ๊ฒฐํฉํ๋ ๋ฐฉ๋ฒ
- ์ปจํ ์ด๋์ ๋ํ ๋ทฐ ํฌ๊ธฐ ์กฐ์ ํ๋ ๋ฐฉ๋ฒ
๋ค๋ฅธ ํ์๋ฐ๋ ๊ฐ์ ์ฌํญ
- SwiftUI์์ ์ธ์ฑ ๊ตฌ๋งค ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ
- ์ด๋ค ๋ทฐ์๋ ์ธ์คํํฐ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ
- ํค ๋๋ฆ ์ด๋ฒคํธ ๊ฐ์ง ๋ฐ ๋์ํ๋ ๋ฐฉ๋ฒ
- Compact ๋ ์ด์์์์ ํ์ํ NavigationSplitView ์ด์ ์ ์ดํ๋ ๋ฐฉ๋ฒ
- ๊ฐ๊ฐ์ ํผ๋๋ฐฑ์ ์ฌ์ฉํ์ฌ ํ ํฑ ํจ๊ณผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ
- ์ฝํ ์ธ ๋ฅผ ์ฌ์ฉํ ์ ์๋ค๊ณ ์ฌ์ฉ์์๊ฒ ์๋ฆฌ๋ ๋ฐฉ๋ฒ
- Color์์ ๋นจ๊ฐ์, ๋ น์ ๋ฐ ํ๋์ ๊ฐ์ ์ฝ๋ ๋ฐฉ๋ฒ
- ๋๋ ์ ๋ ์์ ์ ๋ฐ๋ณตํ๋ ๋ฒํผ ๋ง๋๋ ๋ฐฉ๋ฒ
SwiftUI์ ๋ค๋ฅธ ํฅ๋ฏธ๋ก์ด ๋ณ๊ฒฝ ์ฌํญ
- ์ด์ ๋ํ์ ๋์์ ์ฑ์ฐ๊ณ ์คํธ๋กํฌํ ์ ์๋ ๊ฐ์ ๋ API๊ฐ ์์ต๋๋ค.
- onChange() ์์ ์๋ ์ด์ 0 ๋๋ 2๊ฐ์ ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ์ ์ ์์ผ๋ฉฐ ์ด๊ธฐ ๊ฐ์ ์ํด์๋ ํธ๋ฆฌ๊ฑฐ๋ ์ ์์ต๋๋ค.
- foregroundColor() ์์ ์๋ ๊ณต์์ ์ผ๋ก ์ฌ์ฉ ์ค๋จ๋์์ผ๋ฉฐ foregroundStyle()์ ์ฌ์ฉํ๋๋ก ๊ถ์ฅ๋ฉ๋๋ค.
- ๊ทธ๋ผ๋ฐ์ด์ ๋ด์์ ์์์ ๋ณ๊ฒฝํ๋ฉด iOS 17 ์ดํ์ ์ ๋๋ฉ์ด์ ์ผ๋ก ํ์๋ฉ๋๋ค.
- SwiftUI์ ๊ธฐ๋ณธ ์ ๋๋ฉ์ด์ ์ ์ด์ ์คํ๋ง(Spring)์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ, .bouncy ๋ฐ .snappy์ ๊ฐ์ ๋ ๋ง์ ๋ด์ฅ ์ ๋๋ฉ์ด์ ๋ ์ ๊ณต๋๋ฉฐ, ์คํ๋ง์ ์์ฑํ๋ API๋ ํจ์ฌ ๊ฐ๋จํด์ก์ต๋๋ค.
- ์ง์ฌ๊ฐํ์ ์ผ๋ถ ๋ชจ์๋ฆฌ๋ง ๋ฅ๊ธ๊ฒ ํ๋ ์๋ก์ด ์ง์์ด ์ถ๊ฐ๋์์ต๋๋ค.
- ์ฑ์ฐ๊ธฐ ๋ชจ์๊ณผ ํด๋ฆฝ ๋ชจ์์ ๋ง๋๋ ๋ฐ ๋ ๊ฐ๋จํ ๊ตฌ๋ฌธ์ด ๋์ ๋์์ผ๋ฉฐ, .rect, .capsule ๋ฑ์ ํํ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ํ ์ด๋ธ ๋ทฐ๋ฅผ ์์ฑํ ๋, ์ด์ ForEach(users)๋ผ๊ณ ์์ฑํ ์ ์์ผ๋ฉฐ ForEach(users, content: TableRow.init)์ฒ๋ผ ์์ฑํ ํ์๊ฐ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ SwiftUI ๊ฐ์ ๋ณด๋ค๋ Xcode ๊ฐ์ ์ฌํญ์ ๋ ๊ฐ๊น์ด๋ฐ, ์ด์ ์์ฐ ์นดํ๋ก๊ทธ์์ ์ ์๋ ๋ชจ๋ ์ด๋ฏธ์ง์ ์์์๋ ๋ฌธ์์ด ๋์ ์ฝ๋์์ ์ฌ์ฉํ ์ ์๋ ์ ์ ์ด๋ฆ์ด ์์ต๋๋ค.
์๋ฅผ ๋ค์ด Image(.dog) ๋์ Image("dog")๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ํ ํคํ๋ ์ ์ ๋๋ฉ์ด์ ์ ์ํํ๊ธฐ ์ํ ์๋ก์ด API, ์๋ก์ด ์ง๋ ์ปจํธ๋กค ๋ฐ ๊ธฐํ ์ฌ๋ฌ ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋์์ต๋๋ค. ์์ง ์ด๋ฌํ ์๋ก์ด ๊ธฐ๋ฅ์ ํ๊ตฌํ๊ณ ์ฝ๋ ์ํ์ ์์ฑํ๋ฉฐ ์ ๋์ํ๋ ๊ธฐ์ ์ ์ฐพ๊ณ ์์ต๋๋ค.
ํนํ ์ด๋ฌํ ์๋ก์ด API์์ ์ทจํ๋ ๋ช ๊ฐ์ง ์ ๊ทผ ๋ฐฉ์์ด ๋งค์ฐ ๋ง์์ ๋๋๋ฐ, ์คํฌ๋กค ๋ฐ ๊น๋ฐ์, ๊ฐ๊ฐ์ ํผ๋๋ฐฑ ๋ฐ ๋จ๊ณ ์ ๋๋ฉ์ด์ ๊ณผ ๊ฐ์ ๊ฒ๋ค์ด ๊ฐ๋จํ Equatable ๋น๊ต๋ฅผ ์ฌ์ฉํ์ฌ ํธ๋ฆฌ๊ฑฐ๋ ์ ์๋ ๋ฐฉ์์ด ์ ๋ง๋ก ๋ณต์ก์ฑ์ ๋ฎ์ถ๋ ๋ฐ ๋์์ด ๋๋ค๊ณ ์๊ฐํฉ๋๋ค.
Swift Data
SwiftUI์์ ๋ฐ์ดํฐ ๊ด๋ฆฌ์ ๋ํ ๊ธ๊ฒฉํ๊ณ ํญ๋์ ๋ณ๊ฒฝ ์ฌํญ์ ๋งค์ฐ ํ์๋ฐ๋ ์ผ์ ๋๋ค. ์ฌ์ค, ์ ํ์ Apple Park์์
์ด๋ฆฐ State of the Union ์ธ์ ์ค์ ์ ๊ฐ ์ง์ง๋ก ๋น๋ช ์ ์ง๋ฅธ ๋์์์ด ์์ต๋๋ค. ์ด๊ฒ์ ๋ณด๊ณ ์ ๋ง๋ก ๊ธฐ์๊ฒ ์๊ฐํ์ต๋๋ค.
๊ทธ๋ฌ๋ ์ด๊ฒ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉํ๊ธฐ ์ํด ์ฃผ์๋ฅผ ๊ธฐ์ธ์ฌ์ผ ํ๋ ๋ถ๋ถ์ด๊ธฐ๋ ํฉ๋๋ค. ๋ฌผ๋ก ์ ๋ ์ด์ ๋ํ ๋ด์ฉ์ ์ฑ ์ ์ ๋ฐ์ดํธํ ๊ฒ์ ๋๋ค!
์ ์คํ๊ฒ ์ฌ์ฉํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค.