Skip to content

Instantly share code, notes, and snippets.

@YanSte
Created August 18, 2022 07:59
Show Gist options
  • Save YanSte/b7e48ec4d7ad7b64887775c5ba095338 to your computer and use it in GitHub Desktop.
Save YanSte/b7e48ec4d7ad7b64887775c5ba095338 to your computer and use it in GitHub Desktop.
UserDefaultsStore, Generic UserDefaults Wrapper Using Property Wrapper
import Foundation
/// UserDefaultsStore, a generic UserDefaults Wrapper store
///
/// How to use:
/// ```
/// enum MyEnum {
/// case myKey
/// }
/// @UserDefaultsStore(
/// type: MyEnum.self,
/// key: .myKey,
/// defaultValue: "MyDefaultValue",
/// store: .myCustomUserDefaults
/// )
/// ```
///
@propertyWrapper
public struct UserDefaultsStore<Keys: RawRepresentable, Value: Codable> where Keys.RawValue == String {
// MARK: Private properties
private let key: Keys
private let defaultValue: Value
private let store: UserDefaults
public init(
type: Keys.Type,
key: Keys,
defaultValue: Value,
store: UserDefaults = .standard
) {
self.key = key
self.defaultValue = defaultValue
self.store = store
}
public var wrappedValue: Value {
get {
// Read value from UserDefaults
guard let data = store.object(forKey: key.rawValue) as? Data else {
// Return defaultValue when no data in UserDefaults
return defaultValue
}
// Convert data to the desire data type
let value = try? JSONDecoder().decode(Value.self, from: data)
return value ?? defaultValue
}
set {
// Convert newValue to data
let data = try? JSONEncoder().encode(newValue)
// Set value to UserDefaults
store.set(data, forKey: key.rawValue)
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment