Skip to content

Instantly share code, notes, and snippets.

@groob
Created November 6, 2019 01:53
Show Gist options
  • Select an option

  • Save groob/9bff849e221bb14d3ecb198ce3636121 to your computer and use it in GitHub Desktop.

Select an option

Save groob/9bff849e221bb14d3ecb198ce3636121 to your computer and use it in GitHub Desktop.

Revisions

  1. groob created this gist Nov 6, 2019.
    71 changes: 71 additions & 0 deletions SynchronizedDefaults.swift
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,71 @@
    /**
    Example SwiftUI which synchronizes GUI toggles as booleans and stores them in UserDefaults

    Mostly from the answer here:
    https://stackoverflow.com/questions/56822195/how-do-i-use-userdefaults-with-swiftui
    */

    import SwiftUI
    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)
    }
    }
    }

    class UserSettings: ObservableObject {
    let objectWillChange = PassthroughSubject<Void, Never>()

    @UserDefault("Foo", defaultValue: true)
    var foo: Bool {
    willSet {
    objectWillChange.send()
    }
    }

    @UserDefault("Bar", defaultValue: false)
    var bar: Bool {
    willSet {
    objectWillChange.send()
    }
    }
    }

    struct ContentView: View {
    @ObservedObject var settings = UserSettings()
    var body: some View {
    VStack {
    HStack {
    Toggle("toggle-foo",isOn: $settings.foo).toggleStyle(SwitchToggleStyle())
    Text(settings.foo ? "Foo:On!" : "Foo:Off!")
    }
    HStack{
    Toggle("toggle-bar",isOn: $settings.bar).toggleStyle(SwitchToggleStyle())
    Text(settings.bar ? "Bar:On!" : "Bar:Off!")
    }
    }.frame(maxWidth: .infinity, maxHeight: .infinity)
    }
    }


    struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
    ContentView()
    }
    }