Skip to content

Commit

Permalink
Mark user defaults types public
Browse files Browse the repository at this point in the history
  • Loading branch information
JosephDuffy committed Mar 24, 2024
1 parent e8bfd61 commit 321089c
Show file tree
Hide file tree
Showing 3 changed files with 30 additions and 30 deletions.
24 changes: 12 additions & 12 deletions Sources/Persist/UserDefaults/StorableInUserDefaults.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}
}
Expand All @@ -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))
}
}
Expand All @@ -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))
}
}
Expand Down
20 changes: 10 additions & 10 deletions Sources/Persist/UserDefaults/UserDefaultsStorage.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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]] = [:]

Expand All @@ -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
}

Expand All @@ -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
}
Expand All @@ -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)
Expand All @@ -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)
}

Expand All @@ -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
Expand All @@ -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.")
Expand Down
16 changes: 8 additions & 8 deletions Sources/Persist/UserDefaults/UserDefaultsValue.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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)
}

Expand Down Expand Up @@ -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<Type>(to type: Type.Type) -> Type? {
public func cast<Type>(to type: Type.Type) -> Type? {
switch self {
case .number(let nsNumber):
if type == Bool.self {
Expand All @@ -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
Expand All @@ -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 {
Expand Down

0 comments on commit 321089c

Please sign in to comment.