์๋ ํ์ธ์ ์ ์ธ์ ๋๋ค :)
SwiftUI์์๋ ๋ทฐ๋ฅผ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ๋ฐ์ดํธ ํ๋์ง ์์๋ณด๊ณ , SwiftUI์์ ์ ๊ณตํด์ฃผ๋ ๋ค์ํ ํ๋กํผํฐ ๋ํผ ์ค ๋ํ์ ์ธ ๋ช ๊ฐ์ง์ ๋ํด์ ์ดํด๋ณผ๊ฒ์~!
SwiftUI์ View ์ ๋ฐ์ดํธ ๋ฐฉ์
SwiftUI์์๋ ๋ฐ์ดํฐ๊ฐ ๋ฐ๋๋ฉด ์ด์ ๋ฐ๋ผ ๋ทฐ๊ฐ ๋ฐ๋๋๋ค. ์ฆ, ๋ทฐ๋ ๋ฐ์ดํฐ์ ๋ํ ์์กด์ฑ์ ๊ฐ์ง๋๋ค.
SwiftUI์์๋ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ทฐ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฉ์ปค๋์ฆ์ด ๋ด๋ถ์ ์กด์ฌํฉ๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ ์์ ์ ๊ณ์ฐํด์ ๋ทฐ๋ฅผ ์ ๋ฐ์ดํธ ์์ผ์ฃผ๋ ์ผ์ ๊ฐ๋ฐ์๊ฐ ์ผ์ผ์ด ํด์ฃผ์ง ์์๋ ๋๋ ๊ฒ์ด์ฃ . ์ด๋ฅผ ์ํด SwiftUI์์๋ ๋ค์ํ ํ๋กํผํฐ ๋ํผ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด ์ค ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ @State, @Binding ์ ์ด์ฉํด ์ด๋ค ๋ฐฉ์์ผ๋ก ๋ทฐ๋ฅผ ์ ๋ฐ์ดํธ ํ๊ฒ ๋๋ ๊ฒ์ธ์ง ์ ๋ฆฌํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
@State
- ์๊ตฌ์ ์ธ ์ ์ฅ์๋ฅผ ์์ฑ (Single Source of Truth)
- ๋ทฐ์ ๋ํ ์์กด์ฑ ์ถ์
- ๊ฐ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ ๋ทฐ ๊ณ์ธต์ ๋ถ๋ถ๋ง ์ ๋ฐ์ดํธ (ํจ์จ์ ์ธ ์ ๋ฐ์ดํธ)
- state๋ก ์ ์๋ ํ๋กํผํฐ๋ฅผ ํ์ ๋ทฐ์ ์ ๋ฌํ๋ฉด ๊ฐ ๋ณ๊ฒฝ ๋ ๋๋ง๋ค ํ์ ๋ทฐ๊น์ง ์ ๋ฐ์ดํธ ๋จ. but ํ์ ๋ทฐ์์ ๊ฐ์ ์์ ํ ์๋ ์๋ค! (ํ์ ๋ทฐ๊น์ง ์ฐ๊ฒฐํ๋ ค๋ฉด @Binding์ ์ ๋ฌํด์ผ ํจ)
๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ๋ฐ๋ฅธ ๋ทฐ ์ ๋ฐ์ดํธ ๊ณผ์
@State ํ๋กํผํฐ์ ์ ์ฅ๋๋ ๊ฐ์ ๋ณ๊ฒฝ์ ๋ฐ๋ผ ๋ทฐ๊ฐ ๊ฐฑ์ ๋๋ ๊ณผ์ ์ ๊ฐ๋จํ ์์ ์ฝ๋์ ๊ทธ๋ฆผ์ผ๋ก ์ดํดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!
struct PlayButton: View {
@State private var isPlaying: Bool = false // Create the state.
var body: some View {
Button(isPlaying ? "Pause" : "Play") { // Read the state.
isPlaying.toggle() // Write the state.
}
}
}
์์ ์ฝ๋๋ ๊ณต์๋ฌธ์์ ๋์์๋ ๊ฐ๋จํ ์ฝ๋๋ฆฐ๋ฐ์, ๋ทฐ์ body ๋ด์์ ๋ฒํผ์ผ๋ก state๋ก ์ ์ธ๋ isPlaying ์ด๋ผ๋ ํ๋กํผํฐ์ ๊ฐ์ ๋ณ๊ฒฝํด์ฃผ๊ณ ์์ต๋๋ค. isPlaying ๊ฐ(= ๋ฐ์ดํฐ)์ด ๋ณํ๋ฉด ์ด์ ๋ฐ๋ผ Button ํ์ดํ UI(= ๋ทฐ)๊ฐ ๋ณ๊ฒฝ๋๋๋ฐ์, ์ด๋ค ๊ณผ์ ์ผ๋ก ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ๊ฐ์งํด์ ๋ทฐ๋ฅผ ์ ๋ฐ์ดํธํด์ค ์ ์๋์ง ๊ทธ๋ฆผ์ผ๋ก ์ดํด๋ณผ๊ฒ์!
1. @State๋ก ์ ์ธ๋ ํ๋กํผํฐ์ ์๊ตฌ์ ์ธ ์ ์ฅ์ ํ ๋น
๋จผ์ , SwiftUI๋ @State๋ก ์ ์ธ๋ ํ๋กํผํฐ์ ์๊ตฌ์ ์ธ ์ ์ฅ์๋ฅผ ํ ๋นํ๊ฒ ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฉด, ์ด์ ๋ทฐ ๋ ๋๋ง์ด ํด๋น ๊ฐ์ ์์กดํ๊ฒ ๋๋ค๋ ๊ฒ์ ๋ด๋ถ์ ์ผ๋ก ์ ์ ์์ต๋๋ค.
2. ํ๋กํผํฐ ๋ณ๊ฒฝ ํ ๊ด๋ จ ๋ทฐ๋ค์ ์ฌ์์ฑ
์์ ์ฝ๋์์, ๋ฒํผ์ ๋๋ฅด๋ฉด isPlaying ๊ฐ์ด ๋ณ๊ฒฝ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฉด, ํด๋น ์ํ์ ์์กดํ๊ณ ์๋ ๋ทฐ์ body๋ฅผ ํธ์ถํ์ฌ ๋ทฐ๋ฅผ ์ฌ์์ฑํ๊ฒ ๋ฉ๋๋ค. ์ด ๋, ๋ทฐ ์ ์ฒด๋ฅผ ์ฌ์์ฑํ๋๊ฒ ์๋๋ผ ๋ทฐ ๊ณ์ธต๊ตฌ์กฐ๋ฅผ ๋ฐ๋ผ ๋ด๋ ค๊ฐ๋ฉด์ ๊ฐฑ์ ์ด ํ์ํ ๋ถ๋ถ๋ง ๊ฒ์ฌํด์ ํด๋น ๋ถ๋ถ๋ง ๋ค์ ๋ ๋๋งํ๊ฒ ๋ฉ๋๋ค.
@Binding
์์์ @State๋ฅผ ์ด์ฉํ๋ฉด ํ์ ๋ทฐ์์ ๊ฐ์ ์์ ํ ์๋ ์๋ค๊ณ ์ค๋ช ํ์ต๋๋ค.
ํ์ง๋ง, ๊ฐ๋ฐ์ ํ๋ค๋ณด๋ฉด ๋ทฐ ๊ณ์ธต์ ๋๋ ์ผ ํ ์ผ์ด ์๊ธฐ๊ฒ ๋์ฃ ? ์ด ๋, ํ์ ๋ทฐ๊น์ง ์ฐ๊ฒฐ์ ํด์ฃผ๊ธฐ ์ํด @Binding์ ์ด์ฉํฉ๋๋ค.
- ์์ ๋ทฐ์ ํ์ ๋ทฐ ์ฌ์ด์ ์๋ฐฉํฅ ์ฐ๊ฒฐ์ ๋ง๋ฆ
- ๊ฐ์ ์ง์ ์ ์ฅํ๋ ๋์ , ๊ฐ์ ์ฐธ์กฐ๋ฅผ ์ ์ฅ
- ์ฆ, @Binding ์ ์ฌ์ฉํด ์์ ๋ทฐ์ ์์ฑ์ ์ฐ๊ฒฐ์ ๋ง๋๋ ๊ฒ
- ํ์ ๋ทฐ๋ ๋์ผํ ์์ค๋ฅผ ๋ฐ๋ผ๋ณด๋ฉฐ ์ฝ๊ธฐ/์ฐ๊ธฐ ๋ชจ๋ ๊ฐ๋ฅํด์ง
- state ํ๋กํผํฐ์์ projectedValue๋ฅผ ํตํด binding ๊ฐ์ ์ป์ ์ ์์ผ๋ฉฐ, ์ด ๊ฐ์ $property๋ช ํ์์ผ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅ
์์์ ๋ดค๋ ์์ ์ฝ๋๋ฅผ ์์ ํด PlayButton ๊ตฌ์กฐ์ฒด๋ฅผ PlayView ๊ตฌ์กฐ์ฒด์ ํ์ ๋ทฐ๋ก ๋ง๋ค๊ณ , @Binding์ ์ด์ฉํด ์ฐ๊ฒฐํด๋ณด๊ฒ ์ต๋๋ค.
struct PlayButton: View {
@Binding var isPlaying: Bool // Play button now receives a binding.
var body: some View {
Button(isPlaying ? "Pause" : "Play") {
isPlaying.toggle()
}
}
}
๋จผ์ , @State๋ก ์ ์๋์ด ์๋ isPlaying์ @Binding์ผ๋ก ์ ์ํด์ค๋๋ค.
struct PlayerView: View {
@State private var isPlaying: Bool = false // Create the state here now.
var body: some View {
VStack {
PlayButton(isPlaying: $isPlaying) // Pass a binding.
// ...
}
}
}
๊ทธ๋ฐ ๋ค์, PlayButton์ ์์ ๋ทฐ์ธ PlayerView๋ฅผ ๋ง๋ค๊ณ , ์ด ์์ ๋ทฐ์์ isPlaying์ @State๋ก ์ ์ํด์ค๋๋ค.
๊ทธ๋ฌ๋ฉด ์์ ๋ทฐ์์ ์์๋๋ ํ๋์ ์ ์ฅ์๊ฐ ์๊ธด ๊ฒ์ด๊ณ , ์ด์ ์ฐ๊ฒฐ๋๋ ํ๋กํผํฐ๊ฐ ์ด Single truth of Source๋ฅผ ๋ฐ๋ผ๋ณด๊ณ ์๋ ๊ฒ์ผ๋ก, @Binding์ผ๋ก ์ฐ๊ฒฐ๋ ํ์ ๋ทฐ์ ์์ฑ๋ค์ ๋ชจ๋ ์ด state ํ๋กํผํฐ์ ๋ํด ์ฝ๊ธฐ/์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํด์ง๊ฒ ๋ฉ๋๋ค.
์ฝ๋๋ฅผ ์์ธํ ๋ณด๋ฉด, PlayerView๋ isPlaying ์ด๋ผ๋ state ๊ฐ์ ๋์ผํ ์ด๋ฆ์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํฉ๋๋ค. ($๋ถ์ฌ์ ๊ฐ์ ์ ๋ฌ)
ํ์ ๋ทฐ์ธ PlayButton์์๋ isPlaying ์ด๋ผ๋ ๋ฐ์ธ๋ฉ ๊ฐ์ ์ฌ์ฉํด ์์ ๋ทฐ์ isPlaying ๊ฐ์ ์ฝ๊ณ ์ ๋ฐ์ดํธํฉ๋๋ค.
SwiftUI๋ก ๊ฐ๋ฐ์ ํ๊ธฐ ์ํด ํ์ํ ์์ฃผ ๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ์ธ๋ฐ, ์ด๋ ๊ฒ ๊ทธ๋ฆผ์ ์ด์ฉํด ์ค๋ช ํด๋ณด๋ ๋ ํ์คํ๊ฒ ์ ๋ฆฌ๊ฐ ๋๋ ๊ฒ ๊ฐ๋ค์๐
SwiftUI์์ ์ ๊ณตํด์ฃผ๋ State ๊ด๋ จ ํ๋กํผํฐ ๋ํผ๊ฐ ๊ต์ฅํ ๋ง์๋ฐ, ๊ฐ๋ฐํ๋ฉด์ ๋ง์ด ์ฌ์ฉํ์๋ ํ๋กํผํฐ ๋ํผ์ ๋ํด ๋ค๋ฅธ ๊ฒ์๊ธ์์ ๋ ์ ๋ฆฌํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!
๊ธด ๊ธ ์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค๐
[์ฐธ๊ณ ์๋ฃ]
'๐ iOS > SwiftUI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SwiftUI] View Life Cycle (0) | 2024.08.19 |
---|