From 7eb214190f67f4bc8f89840435160f5fedce2a8c Mon Sep 17 00:00:00 2001 From: Vlad Papko Date: Wed, 2 Dec 2020 14:20:55 -0600 Subject: [PATCH 1/4] Fixes PropertyWrapper to support custoom adapter --- Sources/PropertyWrappers.swift | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/Sources/PropertyWrappers.swift b/Sources/PropertyWrappers.swift index 585038f1..8dc0d0b1 100644 --- a/Sources/PropertyWrappers.swift +++ b/Sources/PropertyWrappers.swift @@ -36,30 +36,46 @@ public struct SwiftyUserDefaultOptions: OptionSet { } @propertyWrapper -public final class SwiftyUserDefault where T.T == T { +public final class SwiftyUserDefault where T.T == T { public let key: DefaultsKey public let options: SwiftyUserDefaultOptions + private var customAdapter: DefaultsAdapter? public var wrappedValue: T { get { if options.contains(.cached) { - return _value ?? Defaults[key: key] + if let value = _value { + return value + } else if let customAdapter = customAdapter { + return customAdapter[key: key] + } else { + return Defaults[key: key] + } } else { - return Defaults[key: key] + if let customAdapter = customAdapter { + return customAdapter[key: key] + } else { + return Defaults[key: key] + } } } set { _value = newValue - Defaults[key: key] = newValue + if var customAdapter = customAdapter { + customAdapter[key: key] = newValue + } else { + Defaults[key: key] = newValue + } } } private var _value: T.T? private var observation: DefaultsDisposable? - public init(keyPath: KeyPath>, adapter: DefaultsAdapter, options: SwiftyUserDefaultOptions = []) { + public init(keyPath: KeyPath>, adapter: DefaultsAdapter, options: SwiftyUserDefaultOptions = []) { self.key = adapter.keyStore[keyPath: keyPath] + self.customAdapter = adapter self.options = options if options.contains(.observed) { @@ -72,6 +88,7 @@ public final class SwiftyUserDefault where T.T == T { public init(keyPath: KeyPath>, options: SwiftyUserDefaultOptions = []) { self.key = Defaults.keyStore[keyPath: keyPath] self.options = options + self.customAdapter = nil if options.contains(.observed) { observation = Defaults.observe(key) { [weak self] update in From c406e6acd7636e0699dc2348e8c6e21b91e320f9 Mon Sep 17 00:00:00 2001 From: Vlad Papko Date: Wed, 2 Dec 2020 16:45:47 -0600 Subject: [PATCH 2/4] Fixes PropertyWrapper to support custoom adapter (#1) --- Sources/PropertyWrappers.swift | 23 +++++++---------------- 1 file changed, 7 insertions(+), 16 deletions(-) diff --git a/Sources/PropertyWrappers.swift b/Sources/PropertyWrappers.swift index 585038f1..0f209f92 100644 --- a/Sources/PropertyWrappers.swift +++ b/Sources/PropertyWrappers.swift @@ -36,30 +36,32 @@ public struct SwiftyUserDefaultOptions: OptionSet { } @propertyWrapper -public final class SwiftyUserDefault where T.T == T { +public final class SwiftyUserDefault where T.T == T { public let key: DefaultsKey public let options: SwiftyUserDefaultOptions + private var adapter: DefaultsAdapter public var wrappedValue: T { get { if options.contains(.cached) { - return _value ?? Defaults[key: key] + return _value ?? adapter[key: key] } else { - return Defaults[key: key] + return adapter[key: key] } } set { _value = newValue - Defaults[key: key] = newValue + adapter[key: key] = newValue } } private var _value: T.T? private var observation: DefaultsDisposable? - public init(keyPath: KeyPath>, adapter: DefaultsAdapter, options: SwiftyUserDefaultOptions = []) { + public init(keyPath: KeyPath>, adapter: DefaultsAdapter, options: SwiftyUserDefaultOptions = []) { self.key = adapter.keyStore[keyPath: keyPath] + self.adapter = adapter self.options = options if options.contains(.observed) { @@ -69,17 +71,6 @@ public final class SwiftyUserDefault where T.T == T { } } - public init(keyPath: KeyPath>, options: SwiftyUserDefaultOptions = []) { - self.key = Defaults.keyStore[keyPath: keyPath] - self.options = options - - if options.contains(.observed) { - observation = Defaults.observe(key) { [weak self] update in - self?._value = update.newValue - } - } - } - deinit { observation?.dispose() } From d05a8512169332ffdf7faf44f9368a2f3d9c9ca5 Mon Sep 17 00:00:00 2001 From: Danny Gilbert Date: Fri, 4 Dec 2020 18:02:07 -0600 Subject: [PATCH 3/4] git ignore .swiftpm --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index d7fb4e5f..73ceaec1 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ xcuserdata/ /www /Carthage +/.swiftpm From bc7c59f1cf5a500a2de758c52dfc0b976f9481f7 Mon Sep 17 00:00:00 2001 From: Danny Gilbert Date: Fri, 4 Dec 2020 18:02:49 -0600 Subject: [PATCH 4/4] Save DefaultValue on first get if no value exists --- Sources/Defaults+Subscripts.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Sources/Defaults+Subscripts.swift b/Sources/Defaults+Subscripts.swift index bf56f458..98da3130 100644 --- a/Sources/Defaults+Subscripts.swift +++ b/Sources/Defaults+Subscripts.swift @@ -91,6 +91,7 @@ public extension UserDefaults { // swiftlint:disable:next force_cast return _value as! T } else if let defaultValue = key.defaultValue { + T._defaults.save(key: key._key, value: defaultValue, userDefaults: self) return defaultValue } else { return T.T.empty @@ -106,6 +107,7 @@ public extension UserDefaults { if let value = T._defaults.get(key: key._key, userDefaults: self) { return value } else if let defaultValue = key.defaultValue { + T._defaults.save(key: key._key, value: defaultValue, userDefaults: self) return defaultValue } else { fatalError("Shouldn't happen, please report!")