Haru's 개발 블로그

[SwiftUI] SwiftUI에서 UserDefaults를 사용 -> @AppStorage 본문

IOS/SwiftUI

[SwiftUI] SwiftUI에서 UserDefaults를 사용 -> @AppStorage

Haru_29 2022. 6. 16. 18:26

어플리케이션 설정을 저장하는데 쓰는 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
Comments