[SwiftUI] 스유에서 뷰를 그리고(draw) 업데이트하는 데이터 흐름 관리 - @propertyWrappers 1
한결
@propertyWrapper
struct UserDefaultsWrapper<Value> {
private let standard = UserDefaults.standard
private let key: someKeyEnums
let defaultValue: Value
init(key: someKeyEnums, defaultValue: Value) {
self.key = key
self.defaultValue = defaultValue
}
var wrappedValue: Value {
get {
standard.value(forKey: key.rawValue) as? Value ?? defaultValue
}
set {
standard.setValue(newValue, forKey: key.rawValue)
}
}
}struct UserSettings {
@UserDefaultsWrapper(key: .name, defaultValue: "이름")
var name: String
@UserDefaultsWrapper(key: .age, defaultValue: 12)
var age: Int
}
let userInfo = UserSettings()
userInfo.name = "새로운 이름"
userInfo.age // 12private struct SomeCountView: View {
@State private var count: Int = 0
var body: some View {
VStack {
Text("\(count)")
Button(
action: {
count += 1
},
label: {
Text("값 1 올리기")
}
)
Button(
action: {
count -= 1
},
label: {
Text("값 1 내리기")
}
)
}
}
}struct ContentView: View {
@State private var count: Int = 0
var body: some View {
VStack {
Text("\(count)")
.padding(.bottom)
SomeButton(count: $count) // $ 기호로 상태값 바인딩
}
}
}
private struct SomeButton: View {
@Binding var count: Int
var body: some View {
Button(
action: {
count += 1
},
label: {
Text("값 1 올리기")
}
)
}
}class CountObservable: ObservableObject {
@Published var count: Int = 0
func countUp() { count += 1 }
func countDown() { count -= 1 }
}
struct CounterView: View {
@StateObject private var countObservable = CountObservable()
var body: some View {
// ObservableObject를 자식뷰에 바인딩 시켜줄 수 있다.
CounterTextView(countObservable: countObservable)
Button {
countObservable.countUp() // @published 멤버를 업데이트 할 수 있다.
} label: { Text("Count Up") }
Button {
countObservable.countDown()
} label: { Text("Count Down") }
}
}
struct CounterTextView: View {
@ObservedObject var countObservable: CountObservable
var body: some View {
Text("\(countObservable.count)")
}
}
