SetValueTransformer.swift [plain text]
import CoreData
import Foundation
@objc(SetValueTransformer)
class SetValueTransformer: ValueTransformer {
override class func transformedValueClass() -> AnyClass {
return NSData.self
}
override class func allowsReverseTransformation() -> Bool {
return true
}
override func transformedValue(_ value: Any?) -> Any? {
do {
guard let value = value else {
return nil
}
return try NSKeyedArchiver.archivedData(withRootObject: value, requiringSecureCoding: true)
} catch {
os_log("Failed to serialize a Set: %@", log: tplogDebug, type: .default, error as CVarArg)
return nil
}
}
override func reverseTransformedValue(_ value: Any?) -> Any? {
do {
guard let dataOp = value as? Data? else {
return nil
}
guard let data = dataOp else {
return nil
}
let unarchiver = try NSKeyedUnarchiver(forReadingFrom: data)
return unarchiver.decodeObject(of: [NSSet.self], forKey: NSKeyedArchiveRootObjectKey)
} catch {
os_log("Failed to deserialize a purported Set: %@", log: tplogDebug, type: .default, error as CVarArg)
return nil
}
}
static let name = NSValueTransformerName(rawValue: "SetValueTransformer")
}