diff --git a/Sources/DefaultsObserver.swift b/Sources/DefaultsObserver.swift index 80a2d1e5..207f97ee 100644 --- a/Sources/DefaultsObserver.swift +++ b/Sources/DefaultsObserver.swift @@ -51,7 +51,7 @@ public final class DefaultsObserver: NSObject, Defaults private static func deserialize(_ value: Any?, for key: DefaultsKey) -> T.T? where T.T == T { guard let value = value else { return nil } - let deserialized = T._defaults.deserialize(value) + let deserialized = T._defaults.deserialize(value) let ret: T.T? if key.isOptional, let _deserialized = deserialized, let __deserialized = _deserialized as? OptionalTypeCheck, !__deserialized.isNil { diff --git a/Sources/PropertyWrappers.swift b/Sources/PropertyWrappers.swift index 585038f1..2eae0825 100644 --- a/Sources/PropertyWrappers.swift +++ b/Sources/PropertyWrappers.swift @@ -35,6 +35,33 @@ public struct SwiftyUserDefaultOptions: OptionSet { } } + +@propertyWrapper +public struct SwiftyDefaults where T.T == T { + public let key: DefaultsKey + private var _value: T.T + public var wrappedValue: T.T { + get { _value } + set { + _value = newValue + Defaults[key: key] = newValue + } + } + public init(keyPath: KeyPath>) { + self.key = Defaults.keyStore[keyPath: keyPath] + self._value = Defaults[key: self.key] + } + public init(key: String, defaultValue value: T) { + self.key = DefaultsKey(key, defaultValue: value) + self._value = Defaults[key: self.key] + } +} +extension SwiftyDefaults where T: OptionalType, T.Wrapped: DefaultsSerializable { + public init(key: String) { + self.init(key: key, defaultValue: T.__swifty_empty) + } +} + @propertyWrapper public final class SwiftyUserDefault where T.T == T { @@ -44,7 +71,10 @@ public final class SwiftyUserDefault where T.T == T { public var wrappedValue: T { get { if options.contains(.cached) { - return _value ?? Defaults[key: key] + if let v = _value { return v } + let v = Defaults[key: key] + _value = v + return v } else { return Defaults[key: key] } @@ -80,8 +110,25 @@ public final class SwiftyUserDefault where T.T == T { } } + public init(key: String, defaultValue value: T, options: SwiftyUserDefaultOptions = []) { + self.key = DefaultsKey(key, defaultValue: value) + self.options = options + + if options.contains(.observed) { + observation = Defaults.observe(self.key) { [weak self] update in + self?._value = update.newValue + } + } + } deinit { observation?.dispose() } } +extension SwiftyUserDefault where T: OptionalType, T.Wrapped: DefaultsSerializable { + public convenience init(key: String, options: SwiftyUserDefaultOptions = []) { + self.init(key: key, defaultValue: T.__swifty_empty, options: options) + } +} + + #endif