import Foundation public protocol SettingsProtocol: ObservableObject { var user: User { get set } var showDebugInfo: Bool { get set } } public class Settings: SettingsProtocol { private let defaults: UserDefaults public static var shared: any SettingsProtocol = Testing.isUITesting ? TestSettings() : Settings() @Published public var user: User { didSet { if let json = try? JSONEncoder().encode(self.user) { self.defaults.set(json, forKey: "user") self.defaults.synchronize() } } } public var showDebugInfo: Bool = false { didSet { self.defaults.set(self.showDebugInfo, forKey: "showDebugInfo") self.defaults.synchronize() } } public init(defaults: UserDefaults = .standard) { self.defaults = defaults self.defaults.register(defaults: [ "showDebugInfo": false ]) self.showDebugInfo = self.defaults.bool(forKey: "showDebugInfo") if let data = self.defaults.data(forKey: "user") { self.user = (try? JSONDecoder().decode(User.self, from: data)) ?? User() } else { self.user = User() } } }