Skip to content

Instantly share code, notes, and snippets.

@fahied
Created February 16, 2020 11:20
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 fahied/f754651846b7401627907e9ddae3430c to your computer and use it in GitHub Desktop.
Save fahied/f754651846b7401627907e9ddae3430c to your computer and use it in GitHub Desktop.
Reduce Boiler Plate code for UserDefault using PropertyWrapper
// Strongly Typed key
struct Key: RawRepresentable {
let rawValue: String
}
extension Key: ExpressibleByStringLiteral {
init(stringLiteral: String) {
rawValue = stringLiteral
}
}
extension Key {
static let isFirstLaunch: Key = "isFirstLaunch"
}
struct DefaultKey {
@UserDefault(.isFirstLaunch, defaultValue: true)
static var isFirstLaunch: Bool
}
// User Default Property Wrapper
// The marker protocol
protocol DefaultsSerializable {}
extension Data: DefaultsSerializable {}
extension String: DefaultsSerializable {}
extension Date: DefaultsSerializable {}
extension Bool: DefaultsSerializable {}
extension Int: DefaultsSerializable {}
extension Double: DefaultsSerializable {}
extension Float: DefaultsSerializable {}
// Every element must be a property-list type
extension Array: DefaultsSerializable where Element: DefaultsSerializable {}
extension Dictionary: DefaultsSerializable where Key == String, Value: DefaultsSerializable {}
@propertyWrapper
struct UserDefault<T> where T: DefaultsSerializable {
let key: Key
let defaultValue: T
init(_ key: Key, defaultValue: T) {
self.key = key
self.defaultValue = defaultValue
}
var wrappedValue: T {
get {
return UserDefaults.standard.object(forKey: key.rawValue) as? T ?? defaultValue
}
set {
UserDefaults.standard.set(newValue, forKey: key.rawValue)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment