import Foundation import SwiftUI @MainActor enum SettingsCodec { private static let sharedJSONEncoder = JSONEncoder() private static let sharedJSONDecoder = JSONDecoder() static func encode(_ value: T) -> Data? { try? sharedJSONEncoder.encode(value) } static func decode(_ type: T.Type, from data: Data) -> T? { try? sharedJSONDecoder.decode(type, from: data) } static func encodeOnce(_ value: T) -> (value: T, encodedData: Data)? { guard let encodedData = encode(value) else { return nil } return (value: value, encodedData: encodedData) } @discardableResult static func applyIfChanged( encodedData: Data, localData: Binding, key: String, enableSync: Bool ) -> Bool { guard localData.wrappedValue != encodedData else { return false } localData.wrappedValue = encodedData if enableSync { NSUbiquitousKeyValueStore.default.set(encodedData, forKey: key) NSUbiquitousKeyValueStore.default.synchronize() } return true } }