--- /dev/null
+//
+// FolioReaderUserDefaults.swift
+// Pods
+//
+// Created by Kevin Delord on 01/04/17.
+//
+//
+
+import Foundation
+
+class FolioReaderUserDefaults {
+
+ /// User Defaults which are dependend on an identifier. If no identifier is given the default standard user defaults are used.
+ fileprivate var userDefaults = [String: Any]()
+
+ fileprivate var identifier: String?
+
+ fileprivate var useStandardUserDefaultsDirectly: Bool {
+ return (self.identifier == nil)
+ }
+
+ init(withIdentifier identifier: String?) {
+ if let _identifier = identifier {
+ self.identifier = "folioreader.userdefaults.identifier.\(_identifier)"
+ }
+
+ guard
+ let prefixedIdentifier = self.identifier,
+ let defaults = UserDefaults.standard.value(forKey: prefixedIdentifier) as? [String: Any] else {
+ return
+ }
+
+ self.userDefaults = defaults
+ }
+
+ public func synchronize() {
+ if let identifier = self.identifier {
+ // Add the keys to to the user defaults it they are identifier dependend
+ UserDefaults.standard.set(self.userDefaults, forKey: identifier)
+ }
+
+ UserDefaults.standard.synchronize()
+ }
+}
+
+// MARK: - Getter
+
+extension FolioReaderUserDefaults {
+
+ internal func bool(forKey key: String) -> Bool {
+ guard (self.useStandardUserDefaultsDirectly == false) else {
+ return ((UserDefaults.standard.object(forKey: key) as? Bool) ?? false)
+ }
+
+ guard let value = self.userDefaults[key] as? Bool else {
+ return false
+ }
+
+ return value
+ }
+
+ internal func integer(forKey key: String) -> Int {
+ guard (self.useStandardUserDefaultsDirectly == false) else {
+ return ((UserDefaults.standard.object(forKey: key) as? Int) ?? 0)
+ }
+
+ guard let value = self.userDefaults[key] as? Int else {
+ return 0
+ }
+
+ return value
+ }
+
+ internal func value(forKey key: String) -> Any? {
+ guard (self.useStandardUserDefaultsDirectly == false) else {
+ return UserDefaults.standard.object(forKey: key)
+ }
+
+ return self.userDefaults[key]
+ }
+}
+// MARK: - Setter
+
+extension FolioReaderUserDefaults {
+
+ internal func register(defaults: [String: Any]) {
+ guard (self.useStandardUserDefaultsDirectly == false) else {
+ UserDefaults.standard.register(defaults: defaults)
+ return
+ }
+
+ for (key, value) in defaults where (self.userDefaults[key] == nil) {
+ self.userDefaults[key] = value
+ }
+
+ self.synchronize()
+ }
+
+ internal func set(_ value: Any?, forKey key: String) {
+ if (self.useStandardUserDefaultsDirectly == true) {
+ UserDefaults.standard.set(value, forKey: key)
+ } else {
+ self.userDefaults[key] = value
+ }
+
+ self.synchronize()
+ }
+}