Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save quangDecember/b1e0179d00b834a2f3cd058d59b4c46a to your computer and use it in GitHub Desktop.
Save quangDecember/b1e0179d00b834a2f3cd058d59b4c46a to your computer and use it in GitHub Desktop.
property wrappers for saving to UserDefaults, generics or Codable
import Foundation
@propertyWrapper
struct UserDefault<T> {
let key: String
let defaultValue: T
init(_ key: String, defaultValue: T) {
self.key = key
self.defaultValue = defaultValue
}
var wrappedValue: T {
get {
return UserDefaults.standard.object(forKey: key) as? T ?? defaultValue
}
set {
UserDefaults.standard.set(newValue, forKey: key)
}
}
}
@propertyWrapper
public struct UserDefaultCodable<T: Codable> {
let key: String
let defaultValue: T? = nil
let userDefaultsSuite : UserDefaults = UserDefaults.standard
public var wrappedValue: T? {
get {
if let r = userDefaultsSuite.object(forKey: key) as? Data, let orgVal = try? JSONDecoder().decode(T.self, from: r) {
return orgVal
}
else { return defaultValue}
}
set {
if let n = newValue {
let s = try! JSONEncoder().encode(n)
userDefaultsSuite.set(s, forKey: key)
}
else {
userDefaultsSuite.set(newValue, forKey: key)
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment