ํ์ฌ์์ SwiftUI๋ก ์์ ์ ํ๊ณ ์์ง๋ง, ํ์ฌ ํ๋ก์ ํธ ๊ธฐ๋ฐ์ธ UIKit์ ๊ทธ๋์์ ๋ฒ์ด๋์ง ๋ชป ํด์ ์ธ์ ๋ ๋ฐ์ชฝ์ง๋ฆฌ SwiftUI๋ก ์์ ํ๋ ๊ธฐ๋ถ์ด ๋ค์๋ค. Property Wrapper๋ฅผ ์์ ์ด๊ธฐ์ ํ์ฌ ์ปจํ๋ฃจ์ธ์ค์ ์ ๋ฆฌํ๊ณ , ๊ทธ ๊ธ์ ๋ค์ ์ด ๋ธ๋ก๊ทธ์ ์ ๊ธฐ๋ ํ๋๋ฐ ๊ทธ๋ ํ์ฌ์์ ๊ฒ์ํด๋ ๋ญ๊ฐ ๋ญ์ง ๋ชฐ๋ผ์ ์ ์๋ณด๋ค๋ ๋ป์ ์ฐพ์๋ณธ ๋๋์ด ๊ฐํ๋ค. ์ค์ ๋ก ํ์ฌ ํ๋ก์ ํธ์์ ํด๋น wrapper๋ค์ ๋ค ํ์ฉํ์ง ๋ชป ํ๊ธฐ๋ ํ๊ณ .
๊ทธ๋์ ๋ค์ ์ฐจ๊ทผ์ฐจ๊ทผ ํ๋์ฉ ๊ฐ๋จํ ์์ ์ฝ๋๋ฅผ ์ง๋ณด๋ฉฐ ๊ณต๋ถํด๋ณด๊ณ ์ ๋ฆฌํ๊ณ ์ ํ๋ค.
์ฐธ๊ณ ๋ก, wrapper ์ ๋ฆฌํ๋ ๊ฒ์๊ธ์ ์๋ ๋งํฌ์ ๊ธ์ด๋ค. ๊ฑฐ์ฐฝํ ์ด์ ๋ฆฌ๋ ํ์ดํ๊ณผ ๋ฌ๋ฆฌ ์ ๋ง ์ ์ ์์ฃผ๋ก ์ ๋ฆฌ๋ ๊ธ์ด๋ค.
https://calliek.tistory.com/54#%C2%A0-8
์ด ํฌ์คํธ์ ์ฃผ์ ์ธ ObservableObject, ObservaedObject, Published๋ ๋ชจ๋ Combine์ ์ํด์๋ค.
Combine์ rxSwift์ฒ๋ผ ๋น๋๊ธฐ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ์ ํ์ด ๋ง๋ ํ๋ ์์ํฌ๋ค.
๊ทธ๋ฐ๋ฐ ๊ฐ์๊ธฐ ์ปด๋ฐ์ธ์ ์ ์ฌ๊ธฐ์ ์ฐ๋์ง์ ๋ํด ์๋ฌธ์ด ๋ค ์๋ ์๋๋ฐ, state - binding์ ์์-ํ์๋ทฐ๊ฐ ๋ช ํํ ๋ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋ค์์ ๋ทฐ์์ ์ฌ์ฉํ๊ธฐ์ ์ ํฉํ์ง ์๋ค. ์ธ๋ถ์ ์ ์ธ ๋ ๊ฐ์ ๊ด์ฐฐํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ํฉ์์ ์ด๋ฒคํธ ๋ณํ๋ฅผ ๊ด์ฐฐํ๋ observableObject์ observedObject ์ฐ๋ ๊ฒ ์ ํฉํ๋ค.
ObservableObject
- ObservableObject๋ ๊ฐ์ฒด๊ฐ ๋ณ๊ฒฝ ๋๊ธฐ ์ ์ ๋ฐฉ์ถํ๋ ํผ๋ธ๋ฆฌ์ ๋ฅผ ๊ฐ์ง ๊ฐ์ฒด๋ค.
- ๋ณํ๋ฅผ ๊ฐ์งํ ์ ์๋ ๊ฐ์ฒด๋ก, ObservableObject๋ฅผ ์ฌ์ฉํ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ๊ด์ฐฐํ๊ณ ์๋ค๊ฐ ํ๋กํผํฐ์ ๋ณํ๋ฅผ ๊ฐ์งํ๋ฉด ๋ทฐ๋ฅผ ๋ค์ ๊ทธ๋ฆฌ๋ฉฐ ์ ๋ฐ์ดํธ ํด์ฃผ๋ ์ญํ ์ ํ๋ค.
- "์ ๊ฐ ๋ฐ๋์๋ค, ์ ๋ฐ์ดํธ ์งํ ์์ผ!" ํ๋ ์ญํ ์ ์ํํ๋ค.
Published
- Published๋ ํด๋์ค ๋ด๋ถ ๊ฐ์ฒด์ ๋ณํ๋ฅผ ๊ฐ์งํ์ ๋ ์๋์ผ๋ก ๋ทฐ๋ฅผ ์ ๋ฐ์ดํธ ํ ์ ์๋๋ก ์๋ฆฌ๋ ์ญํ ์ ํ๋ค.
- ObservableObject ํด๋์ค ๋ด๋ถ์ ์ ์ธ ๋์ด ์์ ๋, willSet ์ญํ ์ ํ๋ objectWillChange ํผ๋ธ๋ฆฌ์ ๋ฅผ ์๋์ผ๋ก ํธ์ถํด์ published๋ก ์ ์ธ ๋ ์์ฑ์ ๋ณํ๋ฅผ ๊ฐ์ง ํ ์ ๋ฐ์ดํธํ๋๋ก ํ๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์ฃผ๋ก ObservableObject์ ํจ๊ป ์ฐ์ธ๋ค.
- "๋ ๊ฐ ๋ฐ๋์์ด, ์ ๋ฐ์ดํธ ํด์ผํด!"ํ๋ ์ญํ ์ ์ํํ๋ค.
์ฌ์ฉ ์์
class UserSettings: ObservableObject {
@Published var username = "Anonymous"
@Published var count = 0
@Published var isOn = false
}
1. ๊ณต์๋ฌธ์์๋ ๋ฐ๋ก ๊ฐ์กฐ๋์ด ์๋ ๋ถ๋ถ์ธ๋ฐ, ObservableObject์ Published๋ class ๋ด์์๋ง ์ฌ์ฉํด์ผํ๋ค.
2. ์ ์ ์ ๊ด๋ จ๋ ๊ฐ์ ๊ด์ฐฐํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ UserSettings๋ผ๋ ObservableObject ํด๋์ค๋ฅผ ์ ์ธํ๊ณ , ๊ทธ ์์ ๊ด์ฐฐํ๊ณ ์ถ์ ๊ฐ๋ค์ username, count, isOn ํ๋กํผํฐ๋ก Published ์ ์ธํ๋ค.
3. Published๋ก ์ ์ธํ username, count, isOn์ ๊ฐ์ ๋ณํ๊ฐ ์๊ธฐ๋์ง ๊ด์ฐฐํ๋ค.
ObservedObject
- ObservedObject๋ ๋ทฐ ์ธ๋ถ์์ ์์ฑ๋ ๊ฐ์ฒด ์ํ๋ฅผ ๊ตฌ๋ ํ๊ณ , ์ํ๊ฐ ๋ณํ์ ๋๋ง๋ค UI๋ฅผ ์ ๋ฐ์ดํธํ๋ค.
- "๊ด์ฐฐ ์ค์ด๋ ๋ฐ๋ ์ ์ ๋ฐ์ดํธ ํจ!" ํ๋ ์ญํ ์ ํ๋ค.
์ฌ์ฉ ์์
struct PracticeObservableObject: View {
@ObservedObject var settings = UserSettings()
var body: some View {
VStack {
// MARK: - Change Name
Text("Hello, \(settings.username)")
Button(action: {
settings.username = "New guy"
}, label: {
Text("Change Username")
.labelStyle(.titleOnly)
})
// MARK: - Change Count
Text("count: \(settings.count)")
Button("Add Count") {
settings.count += 1
}
// MARK: - Change Value
Toggle("On", isOn: $settings.isOn)
.padding(.horizontal, 150)
Button("Make it On") {
settings.isOn.toggle()
}
}
}
}
4. PracticeObservableObject ๋ทฐ์ ๋ทฐ ์ธ๋ถ์์ ์ ๋ฌ ๋ฐ๋ UserSettings ๊ฐ์ฒด๋ฅผ ObservedObject๋ก ์์ฑํด์, ํด๋น ๊ฐ์ ๊ตฌ๋ ๋ฐ ๋ณํ ๊ด์ฐฐ ํ๋ค.
5. ๋ฒํผ ์ก์ ์ ๋ฐ๋ผ ๊ฐ์ด ๋ณํํ๋ฉด, ๋ทฐ๋ฅผ ์ ๋ฐ์ดํธ ํ๋ค.
์๋ฎฌ๋ ์ดํฐ
References
https://developer.apple.com/documentation/Combine/ObservableObject
https://developer.apple.com/documentation/swiftui/observedobject
https://developer.apple.com/documentation/combine/published
'๐ Dev > SwiftUI' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[SwiftUI] LifeCycle (1) | 2024.10.14 |
---|---|
[SwiftUI] Navigation 1 (0) | 2024.09.24 |
[SwiftUI] scrollTargetLayout๊ณผ ScrollTargetBehavior (0) | 2024.08.16 |
[SwiftUI] Property Wrapper ์ด์ ๋ฆฌ (0) | 2024.07.26 |
[SwiftUI] Frame (0) | 2024.07.22 |