@@ -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
227236extension 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
237248extension 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+ }
0 commit comments