// // LNUserDefaults.swift // Lanu // // Created by OneeChan on 2025/11/6. // import Foundation var LNUserDefaults: LNUserDefaultsManager { LNUserDefaultsManager.shared } class LNUserDefaultsManager { static let shared = LNUserDefaultsManager() private init() {} // 内存缓存容器 private var cache: [String: Any] = [:] private let lock = NSLock() private let userDefaults: UserDefaults = { return .standard }() subscript(_ key: LNUserDefaultsKey, _ defaultValue: T) -> T { value(forKey: key) ?? defaultValue } subscript(_ key: LNUserDefaultsKey) -> T? { get { value(forKey: key) ?? nil } set { save(newValue, forKey: key) } } /// 存储数据(自动编码) private func save(_ value: T, forKey key: LNUserDefaultsKey) { do { let data = try JSONEncoder().encode(value) userDefaults.set(data, forKey: key.rawValue) // 更新缓存 lock.lock() cache[key.rawValue] = value lock.unlock() } catch { Log.e("存储失败(key: \(key)):\(error)") } } /// 读取数据(自动推断类型,无需显式传递 Type.self) private func value(forKey key: LNUserDefaultsKey) -> T? { // 优先从缓存读取 lock.lock() defer { lock.unlock() } if let cached = cache[key.rawValue] as? T { return cached } // 从 UserDefaults 读取并解码 guard let data = userDefaults.data(forKey: key.rawValue) else { cache.removeValue(forKey: key.rawValue) // 清除无效缓存 return nil } do { let decoded = try JSONDecoder().decode(T.self, from: data) // 缓存解码后的数据 cache[key.rawValue] = decoded return decoded } catch { Log.e("读取失败(key: \(key.rawValue)):\(error)") cache.removeValue(forKey: key.rawValue) return nil } } // 辅助方法:删除数据 func remove(forKey key: LNUserDefaultsKey) { userDefaults.removeObject(forKey: key.rawValue) lock.lock() cache.removeValue(forKey: key.rawValue) lock.unlock() } // 辅助方法:清除所有数据(包括缓存) func clearAll() { userDefaults.removePersistentDomain(forName: Bundle.main.bundleIdentifier!) lock.lock() cache.removeAll() lock.unlock() } // 辅助方法:仅清除内存缓存 func clearCache() { lock.lock() cache.removeAll() lock.unlock() } }