import Foundation public protocol SettingsProtocol { var user: User { get set } var recognizeAlternativeOrder: Bool { get set } var recognizeShortenedNumbers: Bool { get set } var defaultRegion: String { get set } var recordBeep: Bool { get set } var showDebugInfo: Bool { get set } } public class Settings: ObservableObject, SettingsProtocol { private let defaults: UserDefaults public static var shared: SettingsProtocol = Testing.isUITesting ? TestSettings() : Settings() public var user: User { didSet { if let json = try? JSONEncoder().encode(self.user) { self.defaults.set(json, forKey: "user") self.defaults.synchronize() } } } public var recognizeAlternativeOrder: Bool = false { didSet { self.defaults.set(self.recognizeAlternativeOrder, forKey: "recognizeAlternativeOrder") self.defaults.synchronize() } } public var recognizeShortenedNumbers: Bool = false { didSet { self.defaults.set(self.recognizeShortenedNumbers, forKey: "recognizeShortenedNumbers") self.defaults.synchronize() } } public var defaultRegion: String = "" { didSet { self.defaults.set(self.defaultRegion, forKey: "defaultRegion") self.defaults.synchronize() } } public var recordBeep: Bool = false { didSet { self.defaults.set(self.recordBeep, forKey: "recordBeep") 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: [ "recognizeAlternativeOrder": false, "recognizeShortenedNumbers": false, "defaultRegion": "161", "recordBeep": false, "showDebugInfo": false ]) self.recognizeAlternativeOrder = self.defaults.bool(forKey: "recognizeAlternativeOrder") self.recognizeShortenedNumbers = self.defaults.bool(forKey: "recognizeShortenedNumbers") self.defaultRegion = self.defaults.string(forKey: "defaultRegion") ?? "161" self.recordBeep = self.defaults.bool(forKey: "recordBeep") 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() } } }