Skip to content

Instantly share code, notes, and snippets.

@yonat
Created March 5, 2021 09:26
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 yonat/df01f031c1b15f58016498221d9e2dd4 to your computer and use it in GitHub Desktop.
Save yonat/df01f031c1b15f58016498221d9e2dd4 to your computer and use it in GitHub Desktop.
Property wrapper for `UserDefaults.standard` backed value
import Foundation
/// Property wrapper for `UserDefaults.standard` backed value
@propertyWrapper
struct UserDefault<Value: UserDefaultsValue> {
let key: String
let defaultValue: Value
let container: UserDefaults
init(key: String, defaultValue: Value = Value(), container: UserDefaults = .standard) {
self.key = key
self.defaultValue = defaultValue
self.container = container
}
var wrappedValue: Value {
get {
return container.object(forKey: key) as? Value ?? defaultValue
}
set {
container.set(newValue, forKey: key)
}
}
}
protocol UserDefaultsValue {
init()
}
extension NSData: UserDefaultsValue {}
extension NSString: UserDefaultsValue {}
extension NSNumber: UserDefaultsValue {}
extension NSArray: UserDefaultsValue {}
extension NSDictionary: UserDefaultsValue {}
extension Float: UserDefaultsValue {}
extension Double: UserDefaultsValue {}
extension Int: UserDefaultsValue {}
extension Bool: UserDefaultsValue {}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment