| import Foundation | |
| func withUserDefaults<T>(_ updates: [String: Any?], _ body: () throws -> T) rethrows -> T { | |
| let defaults = UserDefaults.standard | |
| var snapshot: [String: Any?] = [:] | |
| for key in updates.keys { | |
| snapshot[key] = defaults.object(forKey: key) | |
| } | |
| for (key, value) in updates { | |
| if let value { | |
| defaults.set(value, forKey: key) | |
| } else { | |
| defaults.removeObject(forKey: key) | |
| } | |
| } | |
| defer { | |
| for (key, value) in snapshot { | |
| if let value { | |
| defaults.set(value, forKey: key) | |
| } else { | |
| defaults.removeObject(forKey: key) | |
| } | |
| } | |
| } | |
| return try body() | |
| } | |