@@ -79,9 +79,7 @@ import Foundation
79
79
let name : Name
80
80
let menuItem : any MenuItem
81
81
82
- private let initialValue : Value
83
82
private let storage : AnyStorage < Value >
84
- private let userDefaultsStorage : UserDefaultsStorage < Value > ?
85
83
86
84
/// Initializes a `Spice` property wrapper for a boolean setting.
87
85
/// - Parameters:
@@ -95,11 +93,8 @@ import Foundation
95
93
name: String ? = nil ,
96
94
requiresRestart: Bool = false
97
95
) where Value == Bool {
98
- self . initialValue = wrappedValue
99
96
self . name = Name ( name)
100
- let userDefaultsStorage = UserDefaultsStorage ( default: wrappedValue, key: key)
101
- self . userDefaultsStorage = userDefaultsStorage
102
- self . storage = AnyStorage ( userDefaultsStorage)
97
+ self . storage = AnyStorage ( UserDefaultsStorage ( default: wrappedValue, key: key) )
103
98
self . menuItem = ToggleMenuItem (
104
99
name: self . name,
105
100
requiresRestart: requiresRestart,
@@ -119,11 +114,8 @@ import Foundation
119
114
name: String ? = nil ,
120
115
requiresRestart: Bool = false
121
116
) where Value: RawRepresentable & CaseIterable {
122
- self . initialValue = wrappedValue
123
117
self . name = Name ( name)
124
- let userDefaultsStorage = UserDefaultsStorage ( default: wrappedValue, key: key)
125
- self . userDefaultsStorage = userDefaultsStorage
126
- self . storage = AnyStorage ( userDefaultsStorage)
118
+ self . storage = AnyStorage ( UserDefaultsStorage ( default: wrappedValue, key: key) )
127
119
self . menuItem = PickerMenuItem (
128
120
name: self . name,
129
121
storage: self . storage,
@@ -141,13 +133,11 @@ import Foundation
141
133
name: String ? = nil ,
142
134
requiresRestart: Bool = false
143
135
) where Value == ButtonHandler {
144
- self . initialValue = wrappedValue
145
136
self . name = Name ( name)
146
137
self . storage = AnyStorage ( ThrowingStorage (
147
138
default: wrappedValue,
148
139
setterMessage: " Cannot set closure of Spices button. "
149
140
) )
150
- self . userDefaultsStorage = nil
151
141
self . menuItem = ButtonMenuItem (
152
142
name: self . name,
153
143
requiresRestart: requiresRestart,
@@ -165,13 +155,11 @@ import Foundation
165
155
name: String ? = nil ,
166
156
requiresRestart: Bool = false
167
157
) where Value == AsyncButtonHandler {
168
- self . initialValue = wrappedValue
169
158
self . name = Name ( name)
170
159
self . storage = AnyStorage ( ThrowingStorage (
171
160
default: wrappedValue,
172
161
setterMessage: " Cannot set closure of Spices button. "
173
162
) )
174
- self . userDefaultsStorage = nil
175
163
self . menuItem = AsyncButtonMenuItem (
176
164
name: self . name,
177
165
requiresRestart: requiresRestart,
@@ -184,13 +172,11 @@ import Foundation
184
172
/// - wrappedValue: The spice store to creaete hierarchial navigation to.
185
173
/// - name: The display name of the spice store. Defaults to a formatted version of the property name.
186
174
public init ( wrappedValue: Value , name: String ? = nil ) where Value: SpiceStore {
187
- self . initialValue = wrappedValue
188
175
self . name = Name ( name)
189
176
self . storage = AnyStorage ( ThrowingStorage (
190
177
default: wrappedValue,
191
178
setterMessage: " Cannot assign new reference to nested spice store. "
192
179
) )
193
- self . userDefaultsStorage = nil
194
180
self . menuItem = ChildSpiceStoreMenuItem ( name: self . name, spiceStore: wrappedValue)
195
181
}
196
182
@@ -214,17 +200,24 @@ import Foundation
214
200
}
215
201
216
202
extension Spice : Preparable {
217
- func prepare( propertyName: String , ownedBy spiceStore: some SpiceStore ) {
203
+ func prepare( propertyName: String , ownedBy spiceStore: any SpiceStore ) {
218
204
name. rawValue = propertyName. camelCaseToNaturalText ( )
219
- userDefaultsStorage? . prepare ( propertyName: propertyName, ownedBy: spiceStore)
220
- if let childSpiceStore = initialValue as? any SpiceStore {
221
- if childSpiceStore. parent != nil {
222
- fatalError ( " A child spice store can only be referenced from one parent. " )
223
- }
224
- childSpiceStore. parent = spiceStore
225
- childSpiceStore. propertyName = propertyName
226
- childSpiceStore. prepareIfNeeded ( )
205
+ storage. prepare ( propertyName: propertyName, ownedBy: spiceStore)
206
+ prepareChildSpiceStoreIfNeeded ( propertyName: propertyName, parent: spiceStore)
207
+ }
208
+ }
209
+
210
+ private extension Spice {
211
+ private func prepareChildSpiceStoreIfNeeded( propertyName: String , parent: any SpiceStore ) {
212
+ guard let childSpiceStore = storage. value as? any SpiceStore else {
213
+ return
214
+ }
215
+ guard childSpiceStore. parent == nil else {
216
+ fatalError ( " A child spice store can only be referenced from one parent. " )
227
217
}
218
+ childSpiceStore. parent = parent
219
+ childSpiceStore. propertyName = propertyName
220
+ childSpiceStore. prepareIfNeeded ( )
228
221
}
229
222
}
230
223
0 commit comments