Code style tweaks
This commit is contained in:
parent
55f3302c3a
commit
5b30f01e46
|
@ -144,9 +144,13 @@ extension Color: Defaults.Serializable {
|
||||||
}
|
}
|
||||||
|
|
||||||
#if os(macOS)
|
#if os(macOS)
|
||||||
/// `NSColor` conforms to `NSSecureCoding`, so it goes to `NSSecureCodingBridge`.
|
/**
|
||||||
|
`NSColor` conforms to `NSSecureCoding`, so it goes to `NSSecureCodingBridge`.
|
||||||
|
*/
|
||||||
extension NSColor: Defaults.Serializable {}
|
extension NSColor: Defaults.Serializable {}
|
||||||
#else
|
#else
|
||||||
/// `UIColor` conforms to `NSSecureCoding`, so it goes to `NSSecureCodingBridge`.
|
/**
|
||||||
|
`UIColor` conforms to `NSSecureCoding`, so it goes to `NSSecureCodingBridge`.
|
||||||
|
*/
|
||||||
extension UIColor: Defaults.Serializable {}
|
extension UIColor: Defaults.Serializable {}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -21,10 +21,14 @@ public protocol DefaultsSerializable {
|
||||||
typealias Serializable = Bridge.Serializable
|
typealias Serializable = Bridge.Serializable
|
||||||
associatedtype Bridge: DefaultsBridge
|
associatedtype Bridge: DefaultsBridge
|
||||||
|
|
||||||
/// Static bridge for the `Value` which cannot be stored natively.
|
/**
|
||||||
|
Static bridge for the `Value` which cannot be stored natively.
|
||||||
|
*/
|
||||||
static var bridge: Bridge { get }
|
static var bridge: Bridge { get }
|
||||||
|
|
||||||
/// A flag to determine whether `Value` can be stored natively or not.
|
/**
|
||||||
|
A flag to determine whether `Value` can be stored natively or not.
|
||||||
|
*/
|
||||||
static var isNativelySupportedType: Bool { get }
|
static var isNativelySupportedType: Bool { get }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -89,16 +93,22 @@ public protocol DefaultsBridge {
|
||||||
}
|
}
|
||||||
|
|
||||||
public protocol DefaultsCollectionSerializable: Collection, Defaults.Serializable {
|
public protocol DefaultsCollectionSerializable: Collection, Defaults.Serializable {
|
||||||
/// `Collection` does not have a initializer, but we need a initializer to convert an array into the `Value`.
|
/**
|
||||||
|
`Collection` does not have a initializer, but we need a initializer to convert an array into the `Value`.
|
||||||
|
*/
|
||||||
init(_ elements: [Element])
|
init(_ elements: [Element])
|
||||||
}
|
}
|
||||||
|
|
||||||
public protocol DefaultsSetAlgebraSerializable: SetAlgebra, Defaults.Serializable {
|
public protocol DefaultsSetAlgebraSerializable: SetAlgebra, Defaults.Serializable {
|
||||||
/// Since `SetAlgebra` protocol does not conform to `Sequence`, we cannot convert a `SetAlgebra` to an `Array` directly.
|
/**
|
||||||
|
Since `SetAlgebra` protocol does not conform to `Sequence`, we cannot convert a `SetAlgebra` to an `Array` directly.
|
||||||
|
*/
|
||||||
func toArray() -> [Element]
|
func toArray() -> [Element]
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Convenience protocol for `Codable`.
|
/**
|
||||||
|
Convenience protocol for `Codable`.
|
||||||
|
*/
|
||||||
public protocol DefaultsCodableBridge: Defaults.Bridge where Serializable == String, Value: Codable {}
|
public protocol DefaultsCodableBridge: Defaults.Bridge where Serializable == String, Value: Codable {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -7,7 +7,9 @@ public protocol DefaultsBaseKey: Defaults.AnyKey {
|
||||||
}
|
}
|
||||||
|
|
||||||
extension DefaultsBaseKey {
|
extension DefaultsBaseKey {
|
||||||
/// Reset the item back to its default value.
|
/**
|
||||||
|
Reset the item back to its default value.
|
||||||
|
*/
|
||||||
public func reset() {
|
public func reset() {
|
||||||
suite.removeObject(forKey: name)
|
suite.removeObject(forKey: name)
|
||||||
}
|
}
|
||||||
|
@ -39,8 +41,11 @@ public enum Defaults {
|
||||||
public final class Key<Value: Serializable>: AnyKey {
|
public final class Key<Value: Serializable>: AnyKey {
|
||||||
public let defaultValue: Value
|
public let defaultValue: Value
|
||||||
|
|
||||||
/// Create a defaults key.
|
/**
|
||||||
/// The `default` parameter can be left out if the `Value` type is an optional.
|
Create a defaults key.
|
||||||
|
|
||||||
|
The `default` parameter can be left out if the `Value` type is an optional.
|
||||||
|
*/
|
||||||
public init(_ key: String, default defaultValue: Value, suite: UserDefaults = .standard) {
|
public init(_ key: String, default defaultValue: Value, suite: UserDefaults = .standard) {
|
||||||
self.defaultValue = defaultValue
|
self.defaultValue = defaultValue
|
||||||
|
|
||||||
|
|
|
@ -28,10 +28,14 @@ extension Defaults {
|
||||||
public typealias Observation = DefaultsObservation
|
public typealias Observation = DefaultsObservation
|
||||||
|
|
||||||
public enum ObservationOption {
|
public enum ObservationOption {
|
||||||
/// Whether a notification should be sent to the observer immediately, before the observer registration method even returns.
|
/**
|
||||||
|
Whether a notification should be sent to the observer immediately, before the observer registration method even returns.
|
||||||
|
*/
|
||||||
case initial
|
case initial
|
||||||
|
|
||||||
/// Whether separate notifications should be sent to the observer before and after each change, instead of a single notification after the change.
|
/**
|
||||||
|
Whether separate notifications should be sent to the observer before and after each change, instead of a single notification after the change.
|
||||||
|
*/
|
||||||
case prior
|
case prior
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,7 +33,9 @@ extension Defaults {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Reset the key back to its default value.
|
/**
|
||||||
|
Reset the key back to its default value.
|
||||||
|
*/
|
||||||
func reset() {
|
func reset() {
|
||||||
key.reset()
|
key.reset()
|
||||||
}
|
}
|
||||||
|
@ -47,7 +49,7 @@ public struct Default<Value: Defaults.Serializable>: DynamicProperty {
|
||||||
|
|
||||||
private let key: Defaults.Key<Value>
|
private let key: Defaults.Key<Value>
|
||||||
|
|
||||||
// Intentionally using `@ObservedObjected` over `@StateObject` so that the key can be dynamicaly changed.
|
// Intentionally using `@ObservedObjected` over `@StateObject` so that the key can be dynamically changed.
|
||||||
@ObservedObject private var observable: Defaults.Observable<Value>
|
@ObservedObject private var observable: Defaults.Observable<Value>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -87,10 +89,14 @@ public struct Default<Value: Defaults.Serializable>: DynamicProperty {
|
||||||
|
|
||||||
public var projectedValue: Binding<Value> { $observable.value }
|
public var projectedValue: Binding<Value> { $observable.value }
|
||||||
|
|
||||||
/// The default value of the key.
|
/**
|
||||||
|
The default value of the key.
|
||||||
|
*/
|
||||||
public var defaultValue: Value { key.defaultValue }
|
public var defaultValue: Value { key.defaultValue }
|
||||||
|
|
||||||
/// Combine publisher that publishes values when the `Defaults` item changes.
|
/**
|
||||||
|
Combine publisher that publishes values when the `Defaults` item changes.
|
||||||
|
*/
|
||||||
public var publisher: Publisher { Defaults.publisher(key) }
|
public var publisher: Publisher { Defaults.publisher(key) }
|
||||||
|
|
||||||
public mutating func update() {
|
public mutating func update() {
|
||||||
|
@ -123,7 +129,9 @@ public struct Default<Value: Defaults.Serializable>: DynamicProperty {
|
||||||
|
|
||||||
@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
|
@available(macOS 10.15, iOS 13.0, tvOS 13.0, watchOS 6.0, *)
|
||||||
extension Default where Value: Equatable {
|
extension Default where Value: Equatable {
|
||||||
/// Indicates whether the value is the same as the default value.
|
/**
|
||||||
|
Indicates whether the value is the same as the default value.
|
||||||
|
*/
|
||||||
public var isDefaultValue: Bool { wrappedValue == defaultValue }
|
public var isDefaultValue: Bool { wrappedValue == defaultValue }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -165,7 +173,7 @@ extension Defaults {
|
||||||
|
|
||||||
private let label: () -> Label
|
private let label: () -> Label
|
||||||
|
|
||||||
// Intentionally using `@ObservedObjected` over `@StateObject` so that the key can be dynamicaly changed.
|
// Intentionally using `@ObservedObjected` over `@StateObject` so that the key can be dynamically changed.
|
||||||
@ObservedObject private var observable: Defaults.Observable<Bool>
|
@ObservedObject private var observable: Defaults.Observable<Bool>
|
||||||
|
|
||||||
public init(key: Key, @ViewBuilder label: @escaping () -> Label) {
|
public init(key: Key, @ViewBuilder label: @escaping () -> Label) {
|
||||||
|
@ -192,7 +200,9 @@ extension Defaults.Toggle where Label == Text {
|
||||||
|
|
||||||
@available(macOS 11, iOS 14, tvOS 14, watchOS 7, *)
|
@available(macOS 11, iOS 14, tvOS 14, watchOS 7, *)
|
||||||
extension Defaults.Toggle {
|
extension Defaults.Toggle {
|
||||||
/// Do something when the value changes to a different value.
|
/**
|
||||||
|
Do something when the value changes to a different value.
|
||||||
|
*/
|
||||||
public func onChange(_ action: @escaping (Bool) -> Void) -> Self {
|
public func onChange(_ action: @escaping (Bool) -> Void) -> Self {
|
||||||
onChange = action
|
onChange = action
|
||||||
return self
|
return self
|
||||||
|
|
|
@ -119,10 +119,15 @@ final class LifetimeAssociation {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// A protocol for making generic type constraints of optionals.
|
/**
|
||||||
/// - Note: It's intentionally not including `associatedtype Wrapped` as that limits a lot of the use-cases.
|
A protocol for making generic type constraints of optionals.
|
||||||
|
|
||||||
|
- Note: It's intentionally not including `associatedtype Wrapped` as that limits a lot of the use-cases.
|
||||||
|
*/
|
||||||
public protocol _DefaultsOptionalType: ExpressibleByNilLiteral {
|
public protocol _DefaultsOptionalType: ExpressibleByNilLiteral {
|
||||||
/// This is useful as you can't compare `_OptionalType` to `nil`.
|
/**
|
||||||
|
This is useful as you cannot compare `_OptionalType` to `nil`.
|
||||||
|
*/
|
||||||
var isNil: Bool { get }
|
var isNil: Bool { get }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,7 +151,9 @@ extension DispatchQueue {
|
||||||
|
|
||||||
|
|
||||||
extension Sequence {
|
extension Sequence {
|
||||||
/// Returns an array containing the non-nil elements.
|
/**
|
||||||
|
Returns an array containing the non-nil elements.
|
||||||
|
*/
|
||||||
func compact<T>() -> [T] where Element == T? {
|
func compact<T>() -> [T] where Element == T? {
|
||||||
// TODO: Make this `compactMap(\.self)` when https://bugs.swift.org/browse/SR-12897 is fixed.
|
// TODO: Make this `compactMap(\.self)` when https://bugs.swift.org/browse/SR-12897 is fixed.
|
||||||
compactMap { $0 }
|
compactMap { $0 }
|
||||||
|
|
|
@ -25,7 +25,9 @@ private struct TimeZone: Hashable {
|
||||||
}
|
}
|
||||||
|
|
||||||
extension TimeZone: Defaults.NativeType {
|
extension TimeZone: Defaults.NativeType {
|
||||||
/// Associated `CodableForm` to `CodableTimeZone`.
|
/**
|
||||||
|
Associated `CodableForm` to `CodableTimeZone`.
|
||||||
|
*/
|
||||||
typealias CodableForm = CodableTimeZone
|
typealias CodableForm = CodableTimeZone
|
||||||
|
|
||||||
static let bridge = TimeZoneBridge()
|
static let bridge = TimeZoneBridge()
|
||||||
|
@ -37,7 +39,9 @@ private struct CodableTimeZone {
|
||||||
}
|
}
|
||||||
|
|
||||||
extension CodableTimeZone: Defaults.CodableType {
|
extension CodableTimeZone: Defaults.CodableType {
|
||||||
/// Convert from `Codable` to `Native`.
|
/**
|
||||||
|
Convert from `Codable` to `Native`.
|
||||||
|
*/
|
||||||
func toNative() -> TimeZone {
|
func toNative() -> TimeZone {
|
||||||
TimeZone(id: id, name: name)
|
TimeZone(id: id, name: name)
|
||||||
}
|
}
|
||||||
|
|
|
@ -380,7 +380,9 @@ private struct CodableTimeZone {
|
||||||
}
|
}
|
||||||
|
|
||||||
extension CodableTimeZone: Defaults.CodableType {
|
extension CodableTimeZone: Defaults.CodableType {
|
||||||
/// Convert from `Codable` to native type.
|
/**
|
||||||
|
Convert from `Codable` to native type.
|
||||||
|
*/
|
||||||
func toNative() -> TimeZone {
|
func toNative() -> TimeZone {
|
||||||
TimeZone(id: id, name: name)
|
TimeZone(id: id, name: name)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue