Skip to content

Instantly share code, notes, and snippets.

@OneSadCookie
Last active February 10, 2017 00:56
Show Gist options
  • Save OneSadCookie/888156b5a5eec2f84cb3f82e79913088 to your computer and use it in GitHub Desktop.
Save OneSadCookie/888156b5a5eec2f84cb3f82e79913088 to your computer and use it in GitHub Desktop.
import Foundation
protocol SerializableToUserDefaults {
static func read(from defaults: UserDefaults, key: String) -> Self
func write(to defaults: UserDefaults, key: String)
}
extension String: SerializableToUserDefaults {
static func read(from defaults: UserDefaults, key: String) -> String {
return defaults.string(forKey: key)!
}
func write(to defaults: UserDefaults, key: String) {
defaults.set(self, forKey: key)
}
}
struct Pref<T: SerializableToUserDefaults> {
let key: String
let defaultValue: T
init(key: String, default defaultValue: T) {
self.key = key
self.defaultValue = defaultValue
}
var value: T {
get {
let defaults = UserDefaults.standard
guard defaults.object(forKey: key) != nil else {
return defaultValue
}
return T.read(from: defaults, key: key)
}
nonmutating set {
let defaults = UserDefaults.standard
newValue.write(to: defaults, key: key)
}
}
}
struct OptionalPref<T: SerializableToUserDefaults> {
let key: String
init(key: String) {
self.key = key
}
var value: T? {
get {
let defaults = UserDefaults.standard
guard defaults.object(forKey: key) != nil else {
return nil
}
return T.read(from: defaults, key: key)
}
nonmutating set {
let defaults = UserDefaults.standard
if let newValue = newValue {
newValue.write(to: defaults, key: key)
} else {
defaults.removeObject(forKey: key)
}
}
}
}
struct Prefs {
static let happy = Pref<String>(key: "happy", default: "possibly")
static let reasonForHappiness = OptionalPref<String>(key: "reasonForHappiness")
}
for (key, _) in UserDefaults.standard.dictionaryRepresentation() {
UserDefaults.standard.removeObject(forKey: key)
}
print(Prefs.happy.value)
Prefs.happy.value = "unlikely"
print(Prefs.happy.value)
print(Prefs.reasonForHappiness.value as Any)
Prefs.reasonForHappiness.value = "kittens"
print(Prefs.reasonForHappiness.value as Any)
Prefs.reasonForHappiness.value = nil
print(Prefs.reasonForHappiness.value as Any)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment