How do I use UserDefaults with SwiftUI?

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


        
5条回答
  •  囚心锁ツ
    2020-11-30 00:44

    The approach from caram is in general ok but there are so many problems with the code that SmushyTaco did not get it work. Below you will find an "Out of the Box" working solution.

    1. UserDefaults propertyWrapper

    import Foundation
    import Combine
    
    @propertyWrapper
    struct UserDefault {
        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()
    
        @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")
            }
        }
    }
    

提交回复
热议问题