Skip to content

Instantly share code, notes, and snippets.

@mkj-is
Created November 15, 2017 15:35
Show Gist options
  • Save mkj-is/25e852fc5d8884dd7c1cf5b90c447f26 to your computer and use it in GitHub Desktop.
Save mkj-is/25e852fc5d8884dd7c1cf5b90c447f26 to your computer and use it in GitHub Desktop.
Wrapper for UserDefaults with Codable in Swift 4
import Foundation
final class DefaultsStore<Value: Codable> {
private let defaults: UserDefaults
private let encoder: PropertyListEncoder
private let decoder: PropertyListDecoder
private let key: String
private let initialValue: Value
var value: Value {
didSet {
permanentValue = value
}
}
init(initialValue: Value, key: String = #function, defaults: UserDefaults = .standard, encoder: PropertyListEncoder = PropertyListEncoder(), decoder: PropertyListDecoder = PropertyListDecoder()) {
self.key = key
self.initialValue = initialValue
self.value = initialValue
self.defaults = defaults
self.encoder = encoder
self.decoder = decoder
self.value = permanentValue
}
private var permanentValue: Value {
get {
if let data = defaults.data(forKey: key), let value = try? decoder.decode(Value.self, from: data) {
return value
}
return initialValue
}
set {
if let data = try? encoder.encode(newValue) {
defaults.set(data, forKey: key)
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment