어플리케이션 설정을 저장하는데 쓰는 UserDefaults 객체이다
State가 바뀔때 State로 UserDefaults를 사용할 것이면 약간의 전처리가 필요하다.
1. UserDefaults propertyWrapper
import Foundation
import Combine
@propertyWrapper
struct UserDefault<T> {
let key: String
let defaultValue: T
init(_ key: String, defaultValue: T) {
self.key = key
self.defaultValue = defaultValue
}
var wrappedValue: T {
get {
return UserDefaults.standard.object(forKey: key) as? T ?? defaultValue
}
set {
UserDefaults.standard.set(newValue, forKey: key)
}
}
}
2.UserSettings class
final class UserSettings: ObservableObject {
let objectWillChange = PassthroughSubject<Void, Never>()
@UserDefault("ShowOnStart", defaultValue: true)
var showOnStart: Bool {
willSet {
objectWillChange.send()
}
}
}
3.SwiftUI view
struct ContentView: View {
@ObservedObject var settings = UserSettings()
var body: some View {
VStack {
Toggle(isOn: $settings.showOnStart) {
Text("Show welcome text")
}
if settings.showOnStart{
Text("Welcome")
}
}
}
이제 ios 14 이상부터 지원하는 @AppStorage 프로퍼티 래퍼를 사용하면, UserDefaults 를 마치 SwiftUI State 처럼 사용할 수 있다.
@available(ios 14.0, *)
struct LoginCheck: View {
@AppStorage("isLoggedIn") var isLoggedIn : Bool = UserDefaults.standard.bool(forKey: "isLoggedIn")
var body: some View {
if isLoggedIn {
Button(action: {
self.isLoggedIn = false
}) {
Text("취소")
}
} else {
Button(action: {
self.isLoggedIn = true
}) {
Text("확인")
}
}
}
}
따라서 @State 바꾸듯 값을 바꾸게 되면, @AppStorage 프로퍼티 래퍼가 UserDefaults의 바뀐 값을 처리해주고, 화면을 새로 갱신해준다.
'IOS > SwiftUI' 카테고리의 다른 글
[SwiftUI] TCA 정리 (0) | 2023.03.01 |
---|---|
[SwiftUI] @StateObject (0) | 2022.06.17 |
[SwiftUI] Coredata 사용해보기 (0) | 2022.05.04 |
[SwiftUI] VoiceViewModel 코드 분석하기 (0) | 2022.05.04 |
[SwiftUI] persistentContainer란 무엇인가? (0) | 2022.05.03 |