Skip to content

Commit b14cc56

Browse files
committed
Minor tweaks
1 parent 034b159 commit b14cc56

File tree

3 files changed

+37
-15
lines changed

3 files changed

+37
-15
lines changed

Sources/Defaults/SwiftUI.swift

Lines changed: 34 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -205,43 +205,56 @@ extension Defaults {
205205
@ViewStorage private var onChange: ((Bool) -> Void)?
206206

207207
private let label: () -> Label
208+
private let inverted: Bool
208209

209-
// Intentionally using `@ObservedObjected` over `@StateObject` so that the key can be dynamically changed.
210+
// Intentionally using `@ObservedObject` over `@StateObject` so that the key can be dynamically changed.
210211
@ObservedObject private var observable: Defaults.Observable<Bool>
211212

212-
public init(key: Defaults.Key<Bool>, @ViewBuilder label: @escaping () -> Label) {
213+
public init(
214+
key: Defaults.Key<Bool>,
215+
inverted: Bool = false,
216+
@ViewBuilder label: @escaping () -> Label
217+
) {
218+
self.inverted = inverted
213219
self.label = label
214220
self.observable = .init(key)
215221
}
216222

217223
@_documentation(visibility: private)
218224
public var body: some View {
219-
SwiftUI.Toggle(isOn: $observable.value, label: label)
220-
.onChange(of: observable.value) {
221-
onChange?($0)
222-
}
225+
SwiftUI.Toggle(
226+
isOn: inverted ? $observable.value.toggled() : $observable.value,
227+
label: label
228+
)
229+
.onChange(of: observable.value) {
230+
onChange?(inverted ? !$0 : $0)
231+
}
223232
}
224233
}
225234
}
226235

227236
extension Defaults.Toggle<Text> {
228237
public init(
229238
_ title: some StringProtocol,
230-
key: Defaults.Key<Bool>
239+
key: Defaults.Key<Bool>,
240+
inverted: Bool = false
231241
) {
232-
self.label = { Text(title) }
233-
self.observable = .init(key)
242+
self.init(key: key, inverted: inverted) {
243+
Text(title)
244+
}
234245
}
235246
}
236247

237248
extension Defaults.Toggle<Label<Text, Image>> {
238249
public init(
239250
_ title: some StringProtocol,
240251
systemImage: String,
241-
key: Defaults.Key<Bool>
252+
key: Defaults.Key<Bool>,
253+
inverted: Bool = false
242254
) {
243-
self.label = { Label(title, systemImage: systemImage) }
244-
self.observable = .init(key)
255+
self.init(key: key, inverted: inverted) {
256+
Label(title, systemImage: systemImage)
257+
}
245258
}
246259
}
247260

@@ -280,3 +293,12 @@ private struct ViewStorage<Value>: DynamicProperty {
280293
self._valueBox = .init(wrappedValue: ValueBox(value()))
281294
}
282295
}
296+
297+
extension Binding<Bool> {
298+
func toggled() -> Self {
299+
.init(
300+
get: { !wrappedValue },
301+
set: { wrappedValue = !$0 }
302+
)
303+
}
304+
}

Tests/DefaultsTests/Defaults+iCloudTests.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -247,8 +247,8 @@ final class DefaultsICloudTests {
247247

248248
@Test
249249
func testAbortion() async {
250-
let name = Defaults.Key<String>("testAbortSignleKey_name", default: "0", iCloud: true) // swiftlint:disable:this discouraged_optional_boolean
251-
let quantity = Defaults.Key<Int>("testAbortSignleKey_quantity", default: 0, iCloud: true) // swiftlint:disable:this discouraged_optional_boolean
250+
let name = Defaults.Key<String>("testAbortSingleKey_name", default: "0", iCloud: true) // swiftlint:disable:this discouraged_optional_boolean
251+
let quantity = Defaults.Key<Int>("testAbortSingleKey_quantity", default: 0, iCloud: true) // swiftlint:disable:this discouraged_optional_boolean
252252
Defaults[quantity] = 1
253253
await Defaults.iCloud.waitForSyncCompletion()
254254
#expect(mockStorage.data(forKey: quantity.name) == 1)

readme.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ You can also declare optional keys for when you don't want to declare a default
113113

114114
```swift
115115
extension Defaults.Keys {
116-
static let name = Key<Double?>("name")
116+
static let name = Key<String?>("name")
117117
}
118118

119119
if let name = Defaults[.name] {

0 commit comments

Comments
 (0)