How do I use UserDefaults with SwiftUI?

前端 未结 5 1861
无人共我
无人共我 2020-11-30 00:18
struct ContentView: View {
@State var settingsConfiguration: Settings
    struct Settings {
        var passwordLength: Dou         


        
5条回答
  •  暗喜
    暗喜 (楼主)
    2020-11-30 00:42

    First, create a property wrapper that will allow us to easily make the link between your Settings class and UserDefaults:

    import Foundation
    
    @propertyWrapper
    struct UserDefault {    
        let key: String
        let defaultValue: Value
    
        var value: Value {
            get {
                let data = UserDefaults.standard.data(forKey: key)
                let value = data.flatMap { try? JSONDecoder().decode(Value.self, from: $0) }
                return value ?? defaultValue
            }
            set {
                let data = try? JSONEncoder().encode(newValue)
                UserDefaults.standard.set(data, forKey: key)
            }
        }
    }
    

    Then, create a data store that holds your settings:

    import Combine
    import SwiftUI
    
    final class DataStore: BindableObject {
        let didChange = PassthroughSubject()
    
        @UserDefault(key: "Settings", defaultValue: [])
        var settings: [Settings] {
            didSet {
                didChange.send(self)
            }
        }
    }
    

    Now, in your view, access your settings:

    import SwiftUI
    
    struct SettingsView : View {
        @EnvironmentObject var dataStore: DataStore
    
        var body: some View {
            Toggle(isOn: $settings.space) {
                Text("\(settings.space)")
            }
        }
    }
    

提交回复
热议问题