diff --git a/.gitignore b/.gitignore index d7fb4e5f..73ceaec1 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ xcuserdata/ /www /Carthage +/.swiftpm 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!") 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() }