Skip to content

Instantly share code, notes, and snippets.

@rudedogdhc
Last active August 29, 2023 23:19
Show Gist options
  • Save rudedogdhc/0ae51a8e97a350458386fd914f0f9874 to your computer and use it in GitHub Desktop.
Save rudedogdhc/0ae51a8e97a350458386fd914f0f9874 to your computer and use it in GitHub Desktop.
import Foundation
public protocol ValueTransforming: NSSecureCoding {
static var valueTransformerName: NSValueTransformerName { get }
}
public class NSSecureCodingValueTransformer<T: NSObject & ValueTransforming>: ValueTransformer {
public override class func transformedValueClass() -> AnyClass { T.self }
public override class func allowsReverseTransformation() -> Bool { true }
public override func transformedValue(_ value: Any?) -> Any? {
guard let value = value as? T else { return nil }
return try? NSKeyedArchiver.archivedData(withRootObject: value, requiringSecureCoding: true)
}
public override func reverseTransformedValue(_ value: Any?) -> Any? {
guard let data = value as? NSData else { return nil }
let result = try? NSKeyedUnarchiver.unarchivedObject(
ofClass: T.self,
from: data as Data
)
return result
}
/// Registers the transformer by calling `ValueTransformer.setValueTransformer(_:forName:)`.
public static func registerTransformer() {
let transformer = NSSecureCodingValueTransformer<T>()
ValueTransformer.setValueTransformer(transformer, forName: T.valueTransformerName)
}
}
@rudedogdhc
Copy link
Author

rudedogdhc commented Oct 23, 2019

A value transformer for any object that implements NSSecureCoding. Useful for things such as Core Data entities with transformable attributes. To use:

  1. Ensure that your object adopts ValueTransforming and returns a valid name:

    extension UIColor: ValueTransforming {
      static var valueTransformerName: NSValueTransformerName { .init("UIColorValueTransformer") }
    }
    
  2. Register the transformer before fetching or creating the entity that has a transformable attribute, such as in application(_:didFinishLaunchingWithOptions:):

     NSSecureCodingValueTransformer<UIColor>.registerTransformer()
    
  3. Specify the transformer name in your Core Data model to be UIColorValueTransformer, which is the name you specified when adopting the ValueTransforming protocol.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment