Created
February 16, 2020 11:20
-
-
Save fahied/f754651846b7401627907e9ddae3430c to your computer and use it in GitHub Desktop.
Reduce Boiler Plate code for UserDefault using PropertyWrapper
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
// 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