import Foundation /// Actor that handles all UserDefaults operations. /// Provides thread-safe access to UserDefaults with suite support. actor UserDefaultsHelper { public static let shared = UserDefaultsHelper() private init() {} // MARK: - Public Interface /// Stores data in UserDefaults. /// - Parameters: /// - data: The data to store. /// - key: The key to store the data under. /// - suite: Optional suite name. Nil uses standard UserDefaults. /// - Throws: `StorageError.invalidUserDefaultsSuite` if suite is invalid. public func set(_ data: Data, forKey key: String, suite: String?) throws { let defaults = try userDefaults(for: suite) defaults.set(data, forKey: key) } /// Retrieves data from UserDefaults. /// - Parameters: /// - key: The key to retrieve. /// - suite: Optional suite name. /// - Returns: The stored data, or nil if not found. /// - Throws: `StorageError.invalidUserDefaultsSuite` if suite is invalid. public func get(forKey key: String, suite: String?) throws -> Data? { let defaults = try userDefaults(for: suite) return defaults.data(forKey: key) } /// Removes data from UserDefaults. /// - Parameters: /// - key: The key to remove. /// - suite: Optional suite name. /// - Throws: `StorageError.invalidUserDefaultsSuite` if suite is invalid. public func remove(forKey key: String, suite: String?) throws { let defaults = try userDefaults(for: suite) defaults.removeObject(forKey: key) } /// Checks if a key exists in UserDefaults. /// - Parameters: /// - key: The key to check. /// - suite: Optional suite name. /// - Returns: True if the key exists. /// - Throws: `StorageError.invalidUserDefaultsSuite` if suite is invalid. public func exists(forKey key: String, suite: String?) throws -> Bool { let defaults = try userDefaults(for: suite) return defaults.object(forKey: key) != nil } /// Gets all keys in UserDefaults for a given suite. /// - Parameter suite: Optional suite name. /// - Returns: An array of all keys. /// - Throws: `StorageError.invalidUserDefaultsSuite` if suite is invalid. public func allKeys(suite: String?) throws -> [String] { let defaults = try userDefaults(for: suite) return Array(defaults.dictionaryRepresentation().keys) } // MARK: - Private Helpers private func userDefaults(for suite: String?) throws -> UserDefaults { guard let suite else { return .standard } guard let defaults = UserDefaults(suiteName: suite) else { throw StorageError.invalidUserDefaultsSuite(suite) } return defaults } }