Skip to content

Instantly share code, notes, and snippets.

@groob
Created November 6, 2019 01:53
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save groob/9bff849e221bb14d3ecb198ce3636121 to your computer and use it in GitHub Desktop.
Save groob/9bff849e221bb14d3ecb198ce3636121 to your computer and use it in GitHub Desktop.
/**
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()
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment