UserDefaults+Cache.swift 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import Foundation
  2. extension UserDefaults: Cache {
  3. func getValue<T: Codable>(_: T.Type, forKey key: String) -> T? {
  4. getValue(T.self, forKey: key, defaultValue: nil, reportError: true)
  5. }
  6. func getValue<T: Codable>(_: T.Type, forKey key: String, defaultValue: T?, reportError: Bool) -> T? {
  7. guard let data = self.data(forKey: key) else { return defaultValue }
  8. let decoder = JSONDecoder()
  9. do {
  10. let decoded = try decoder.decode(DecodableWrapper<T>.self, from: data)
  11. return decoded.v
  12. } catch {
  13. if reportError {
  14. assertionFailure("Failed to get persisted value for key: \(key), error: \(error.localizedDescription)")
  15. }
  16. }
  17. return defaultValue
  18. }
  19. func setValue<T: Codable>(_ maybeValue: T?, forKey key: String) {
  20. setValue(maybeValue, forKey: key, reportError: true)
  21. }
  22. func setValue<T: Codable>(_ maybeValue: T?, forKey key: String, reportError: Bool) {
  23. if let value = maybeValue {
  24. let wrapper = EncodableWrapper(v: value)
  25. let encoder = JSONEncoder()
  26. do {
  27. let encoded = try encoder.encode(wrapper)
  28. set(encoded, forKey: key)
  29. } catch {
  30. if reportError {
  31. assertionFailure("Failed to set persisted value.for key: \(key), error: \(error.localizedDescription)")
  32. }
  33. }
  34. } else {
  35. removeObject(forKey: key)
  36. }
  37. }
  38. }