Last active
February 10, 2017 00:56
-
-
Save OneSadCookie/888156b5a5eec2f84cb3f82e79913088 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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