diff --git a/Sources/Persist/UserDefaults/StorableInUserDefaults.swift b/Sources/Persist/UserDefaults/StorableInUserDefaults.swift index fc93944..bdfbcb4 100644 --- a/Sources/Persist/UserDefaults/StorableInUserDefaults.swift +++ b/Sources/Persist/UserDefaults/StorableInUserDefaults.swift @@ -7,70 +7,70 @@ import Foundation */ public protocol StorableInUserDefaults {} -internal protocol InternalStorableInUserDefaults: StorableInUserDefaults { +public protocol InternalStorableInUserDefaults: StorableInUserDefaults { /// The value of `self` cast to `UserDefaultsValue`. var asUserDefaultsValue: UserDefaultsValue { get } } extension String: InternalStorableInUserDefaults { /// An `UserDefaultsValue.string` wrapping `self`. - internal var asUserDefaultsValue: UserDefaultsValue { + public var asUserDefaultsValue: UserDefaultsValue { return .string(self) } } extension Data: InternalStorableInUserDefaults { /// An `UserDefaultsValue.data` wrapping `self`. - internal var asUserDefaultsValue: UserDefaultsValue { + public var asUserDefaultsValue: UserDefaultsValue { return .data(self) } } extension URL: InternalStorableInUserDefaults { /// An `UserDefaultsValue.url` wrapping `self`. - internal var asUserDefaultsValue: UserDefaultsValue { + public var asUserDefaultsValue: UserDefaultsValue { return .url(self) } } extension Bool: InternalStorableInUserDefaults { /// An `UserDefaultsValue.bool` wrapping `self`. - internal var asUserDefaultsValue: UserDefaultsValue { + public var asUserDefaultsValue: UserDefaultsValue { return .bool(self) } } extension Int: InternalStorableInUserDefaults { /// An `UserDefaultsValue.int` wrapping `self`. - internal var asUserDefaultsValue: UserDefaultsValue { + public var asUserDefaultsValue: UserDefaultsValue { return .int(self) } } extension Double: InternalStorableInUserDefaults { /// An `UserDefaultsValue.double` wrapping `self`. - internal var asUserDefaultsValue: UserDefaultsValue { + public var asUserDefaultsValue: UserDefaultsValue { return .double(self) } } extension Float: InternalStorableInUserDefaults { /// An `UserDefaultsValue.float` wrapping `self`. - internal var asUserDefaultsValue: UserDefaultsValue { + public var asUserDefaultsValue: UserDefaultsValue { return .float(self) } } extension NSNumber: InternalStorableInUserDefaults { /// A `UserDefaultsValue.number` wrapping `self`. - internal var asUserDefaultsValue: UserDefaultsValue { + public var asUserDefaultsValue: UserDefaultsValue { return .number(self) } } extension Date: InternalStorableInUserDefaults { /// A `UserDefaultsValue.date` wrapping `self`. - internal var asUserDefaultsValue: UserDefaultsValue { + public var asUserDefaultsValue: UserDefaultsValue { return .date(self) } } @@ -79,7 +79,7 @@ extension Array: StorableInUserDefaults where Element: StorableInUserDefaults {} extension Array: InternalStorableInUserDefaults where Element: InternalStorableInUserDefaults { /// An `UserDefaultsValue.array` wrapping `self`. - internal var asUserDefaultsValue: UserDefaultsValue { + public var asUserDefaultsValue: UserDefaultsValue { return .array(map(\.asUserDefaultsValue)) } } @@ -88,7 +88,7 @@ extension Dictionary: StorableInUserDefaults where Key == String {} extension Dictionary: InternalStorableInUserDefaults where Key == String { /// An `UserDefaultsValue.dictionary` wrapping `self`. - internal var asUserDefaultsValue: UserDefaultsValue { + public var asUserDefaultsValue: UserDefaultsValue { return .dictionary(compactMapValues { $0 as? InternalStorableInUserDefaults }.mapValues(\.asUserDefaultsValue)) } } diff --git a/Sources/Persist/UserDefaults/UserDefaultsStorage.swift b/Sources/Persist/UserDefaults/UserDefaultsStorage.swift index 29154a7..797b990 100644 --- a/Sources/Persist/UserDefaults/UserDefaultsStorage.swift +++ b/Sources/Persist/UserDefaults/UserDefaultsStorage.swift @@ -4,17 +4,17 @@ import Foundation /** A `Storage` wrapper around a `UserDefaults` instance. */ -internal final class UserDefaultsStorage: Storage { +public final class UserDefaultsStorage: Storage { /// A property that – when set to `true` – will suppress the message warning of the downsides of /// using `UserDefaults` keys with a dot (`.`) in them. - fileprivate static var suppressDotInKeyWarning = false + public static var suppressDotInKeyWarning = false /// The value type the `UserDefaultsStorage` can store. - internal typealias Value = UserDefaultsValue + public typealias Value = UserDefaultsValue /// The `UserDefaults` this instance wraps. - internal let userDefaults: UserDefaults + public let userDefaults: UserDefaults private var updateListeners: [String: [UUID: UpdateListener]] = [:] @@ -25,7 +25,7 @@ internal final class UserDefaultsStorage: Storage { - parameter userDefaults: The user defaults to use to store and retrieve values. */ - internal init(userDefaults: UserDefaults) { + public init(userDefaults: UserDefaults) { self.userDefaults = userDefaults } @@ -36,7 +36,7 @@ internal final class UserDefaultsStorage: Storage { - parameter suiteName: The domain identifier of the search list. */ - internal init?(suiteName: String?) { + public init?(suiteName: String?) { guard let userDefaults = UserDefaults(suiteName: suiteName) else { return nil } self.userDefaults = userDefaults } @@ -47,7 +47,7 @@ internal final class UserDefaultsStorage: Storage { - parameter value: The value to store. - parameter key: The key to store the value against. */ - internal func storeValue(_ value: UserDefaultsValue, key: String) { + public func storeValue(_ value: UserDefaultsValue, key: String) { switch value { case .url(let url): userDefaults.set(url, forKey: key) @@ -72,7 +72,7 @@ internal final class UserDefaultsStorage: Storage { - parameter key: The key of the value to be removed. */ - internal func removeValue(for key: String) { + public func removeValue(for key: String) { userDefaults.removeObject(forKey: key) } @@ -82,7 +82,7 @@ internal final class UserDefaultsStorage: Storage { - parameter key: The key of the value to retrieve. - returns: The stored value, or `nil` if the a value does not exist for the specified key. */ - internal func retrieveValue(for key: String) -> UserDefaultsValue? { + public func retrieveValue(for key: String) -> UserDefaultsValue? { if let url = userDefaults.url(forKey: key), userDefaults.object(forKey: key) is Data { // `url(forKey:)` will return a URL for values that were not set as // URLs. URLs are stored in UserDefaults as Data so checking @@ -103,7 +103,7 @@ internal final class UserDefaultsStorage: Storage { - parameter updateListener: The closure to call when an update occurs. - returns: An object that represents the closure's subscription to changes. This object must be retained by the caller. */ - internal func addUpdateListener(forKey key: String, updateListener: @escaping UpdateListener) -> AnyCancellable { + public func addUpdateListener(forKey key: String, updateListener: @escaping UpdateListener) -> AnyCancellable { guard !key.contains(".") else { if !UserDefaultsStorage.suppressDotInKeyWarning { print("WARNING: Attempting to observe the UserDefault key \"\(key)\", which contains a dot (`.`). This will cause update listeners to only be called when the value is set on this instance. If this is acceptable you may suppress this message by setting `Persister.suppressDotInUserDefaultsKeyWarning` to `true`. For more information see https://github.com/JosephDuffy/Persist/issues/24.") diff --git a/Sources/Persist/UserDefaults/UserDefaultsValue.swift b/Sources/Persist/UserDefaults/UserDefaultsValue.swift index 2012cb1..b0e2082 100644 --- a/Sources/Persist/UserDefaults/UserDefaultsValue.swift +++ b/Sources/Persist/UserDefaults/UserDefaultsValue.swift @@ -4,32 +4,32 @@ import Foundation /** A value that can be stored in `UserDefaults`. */ -internal enum UserDefaultsValue: Hashable { +public enum UserDefaultsValue: Hashable { /// A `Bool` value. Convenience to convert to `NSNumber`. /// - Parameter bool: The boolean value. /// - Returns: A `UserDefaultsValue.number`. - internal static func bool(_ bool: Bool) -> Self { + public static func bool(_ bool: Bool) -> Self { .number(bool as NSNumber) } /// An `Int` value. Convenience to convert to `NSNumber`. /// - Parameter int: The integer value. /// - Returns: A `UserDefaultsValue.number`. - internal static func int(_ int: Int) -> Self { + public static func int(_ int: Int) -> Self { .number(int as NSNumber) } /// A `Double` value. Convenience to convert to `NSNumber`. /// - Parameter double: The double value. /// - Returns: A `UserDefaultsValue.number`. - internal static func double(_ double: Double) -> Self { + public static func double(_ double: Double) -> Self { .number(double as NSNumber) } /// A `Float` value. Convenience to convert to `NSNumber`. /// - Parameter float: The float value. /// - Returns: A `UserDefaultsValue.number`. - internal static func float(_ float: Float) -> Self { + public static func float(_ float: Float) -> Self { .number(float as NSNumber) } @@ -60,7 +60,7 @@ internal enum UserDefaultsValue: Hashable { `object(forKey:`). For example, storing the `Double` value `123` and calling `object(forKey:)` will return an `Int`. */ - internal func cast(to type: Type.Type) -> Type? { + public func cast(to type: Type.Type) -> Type? { switch self { case .number(let nsNumber): if type == Bool.self { @@ -80,7 +80,7 @@ internal enum UserDefaultsValue: Hashable { } /// The underlying value. - internal var value: Any { + public var value: Any { switch self { case .string(let string): return string @@ -106,7 +106,7 @@ internal enum UserDefaultsValue: Hashable { - returns: An instance of `UserDefaultsValue`, or `nil` if the provided `value` can not be stored in `UserDefaults`. */ - internal init?(value: Any) { + public init?(value: Any) { if let string = value as? String { self = .string(string) } else if let data = value as? Data {