@State
SwiftUI λ state λ‘ μ μΈν νλ‘νΌν°μ μ μ₯μλ₯Ό κ΄λ¦¬νλ€. ν΄λΉ νλ‘νΌν°μ κ°μ΄ λ³κ²½λ λ, SwiftUI λ κ°μ μμ‘΄νκ³ μλ λ·° κ³μΈ΅κ΅¬μ‘°μ λΆλΆμ μ λ°μ΄νΈνλ€. State νλ‘νΌν°λ νλμ λ·° μμμ μ¬μ©λλ κ°μΌλ‘, μΌλ°μ μΌλ‘ private ν€μλλ₯Ό λΆμ¬μ μ¬μ©νλ€.
State instance λ κ°(value)μ μ½κ³ μΈ μ μλ ννμ΄κΈ° λλ¬Έμ, value μ λμΌνμ§λ μλ€. state κ° κ°κ³ μλ value μ μ‘μΈμ€νκΈ° μν΄μλ, property name μ ν΅ν΄ μ κ·Όνλ©΄ λλ€. ν΄λΉ κ°μ wrappedValue μμ±μ λ°ννλ€. wrappedValue λ state λ³μκ° μ μ₯νκ³ μλ κ°μ μ κ·Όνλ νλ‘νΌν°μ΄μ§λ§, wrappedValue λ₯Ό μ§μ μ κ·Όν΄μλ μλλ€.
μλ μμ λ PlayButton view μμ isPlaying μ΄λΌλ state property λ₯Ό μ°Έμ‘°ν΄μ, κ°μ μ½κ³ μ λ°μ΄νΈνλ μμ μ΄λ€. Button label μ isPlaying κ°μ λ°λΌ Pause, Play λ₯Ό μ§μ νκ³ μκ³ , λ²νΌμ λλ₯Όλ μ‘μ μΌλ‘ isPlaying κ°μ ν κΈμν€κ³ μλ€.
struct PlayButton: View {
@State private var isPlaying: Bool = false
var body: some View {
Button(isPlaying ? "Pause" : "Play") {
isPlaying.toggle()
}
}
}
@Binding
State λ³μλ₯Ό μμλ·°λ‘ μ λ¬ν κ²½μ°, SwiftUI λ λΆλͺ¨λ·°μμ state λ³μμ κ°μ΄ λ³κ²½λ λ μμλ·°μκ² μ λ¬νμ§λ§, μμλ·°λ₯Ό κ°μ μ§μ λ³κ²½ν μ μλ€. μμλ·°μμ State λ³μμ κ°μ μμ ν μ μκ² νλ €λ©΄ Binding λ³μλ₯Ό μ λ¬ν΄μΌνλ€. νλ‘νΌν° μ΄λ¦ μμ λ¬λ¬νμ($) λ₯Ό λΆμ΄λ©΄, state value μ λν binding μΈ projectedValue μ λ°μμ¬ μ μλ€.
π μ 리νμλ©΄ λ€μκ³Ό κ°λ€
propertyName μΌλ‘ μ κ·Όμ Value νμ μΈ wrappedValue λ₯Ό λ°ννλ€.
$propertyName μΌλ‘ μ κ·Όμ Binding<Value> νμ μΈ projectedValue λ₯Ό λ°ννλ€.
μλ μμ λ μμ PlayButton View μμ State νλ‘νΌν°λ₯Ό Binding νλ‘νΌν°λ‘ λ³κ²½ν μμ μ΄λ€. PlayButton λ·°κ° PalyerView μ μμλ·°λ‘ μ¬μ©λ κ²½μ°μ State μ μ΄μ©νλ€λ©΄ λΆλͺ¨λ·°λ‘ μ λ¬ν μ μκΈ° λλ¬Έμ, Binding μΌλ‘ λ³κ²½ν΄ λΆλͺ¨λ·°μ state μ μ°κ²°ν΄μ€ κ²μ΄λ€.
PlayerView μμ PlayButton μ μμ±νλ μ½λλ₯Ό 보면 $isPlaying μΌλ‘ State λ³μμ projectedValue λ₯Ό μ λ¬νκ³ μλ€. State λ‘ μ μΈν isPlaying μ νμ μ΄ Bool μ΄λ―λ‘, $isPlaying λ‘ λ°νλλ projectedValue μ νμ μ Binding<Bool> μ΄ λλ€.
struct PlayButton: View {
@Binding var isPlaying: Bool
var body: some View {
Button(isPlaying ? "Pause" : "Play") {
isPlaying.toggle()
}
}
}
struct PlayerView: View {
var episode: Episode
@State private var isPlaying: Bool = false
var body: some View {
VStack {
Text(episode.title)
.foregroundStyle(isPlaying ? .primary : .secondary)
PlayButton(isPlaying: $isPlaying) // Pass a binding.
}
}
}
μ°Έκ³ λ‘, View λ₯Ό μΈμ€ν΄μ€ν νλ λ·° κ³μΈ΅μμ state property λ₯Ό μ΄κΈ°ννλ©΄ μλλ€. SwiftUI κ° μ 곡νλ μ€ν λ¦¬μ§ κ΄λ¦¬μ μΆ©λν μ μκΈ° λλ¬Έμ΄λ€. μ΄λ₯Ό λ°©μ§νκΈ° μν΄μ State λ νμ private μΌλ‘ μ μΈνκ³ , ν΄λΉ κ°μ μ κ·Όμ΄ νμν λ·° κ³μΈ΅μ μ΅μλ¨ λ·°μ State λ₯Ό λ°°μΉν΄μΌνλ€.
λν, Binding νλ‘νΌν°λ₯Ό μμ±ν λμλ μ΄κΈ°κ°μ μ§μ ν μ μλ€. Binding μ μλ³ΈμΈ State μ κ°μ μ°κ²°νλ μν μ νκΈ° λλ¬Έμ, νμ λ§ μ§μ ν μ μλ€. Binding νλ‘νΌν°λ₯Ό κ°λ View μ μμ±μμμλ νμλ‘ Binding μΈμμ κ°μ μ§μ ν΄μ€μΌνλ€.
State νλ‘νΌν°μ κ°μ λ³κ²½νλ κ²μ thread-safe νλ€.
π μ°Έκ³ λ¬Έμ
- Property Wrapper @State - https://developer.apple.com/documentation/swiftui/state
- Property Wrapper @Binding - https://developer.apple.com/documentation/swiftui/binding
- Instance Property wrappedValue - https://developer.apple.com/documentation/swiftui/state/wrappedvalue
- Instatnce Property projectedValue - https://developer.apple.com/documentation/swiftui/state/projectedvalue
'π iOS > SwiftUI' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
[iOS/SwiftUI] @Environment μμ보기 / λͺ¨λ¬ λ·° λ«κΈ° dismiss νμ© (0) | 2023.06.15 |
---|---|
[iOS/SwiftUI] @ViewBuilder, @resultBuilder κ° λ¬΄μμΌκΉ? (0) | 2023.06.07 |
[iOS] SwiftUI LazyVStack LazyHStack :: lazy load views (1) | 2022.06.07 |
[iOS/SwiftUI] Text, Image κΈ°λ³Έ μ 리 + μμ€ν μ΄λ―Έμ§ (0) | 2022.05.05 |
[iOS/SwiftUI] View, Stack κΈ°λ³Έ μ 리 (0) | 2022.04.29 |