Here's my custom StoredRoutes type:
import Foundation
final class StoredRoutes: NSObject, NSSecureCoding {
static var supportsSecureCoding: Bool = true
func encode(with coder: NSCoder) {
var routeids: [NSString] = []
for route in routes {
routeids.append(NSString(string: route.rawValue))
}
coder.encode(NSArray(array: routeids), forKey: "routes")
}
init?(coder: NSCoder) {
if let nsArray = coder.decodeObject(of: NSArray.self, forKey: "routes") {
self.routes = []
for id in nsArray {
self.routes.append(Route(rawValue: id as! String)!)
}
} else {
return nil
}
}
var routes: [Route]
required init(routes: [Route]) {
self.routes = routes
}
}
and my value transformer:
import Foundation
final class StoredRoutesValueTransformer: NSSecureUnarchiveFromDataTransformer {
static var name = NSValueTransformerName(rawValue: "StoredRoutesValueTransformer")
override class func allowsReverseTransformation() -> Bool {
return true
}
override class func transformedValueClass() -> AnyClass {
return StoredRoutes.self
}
override class var allowedTopLevelClasses: [AnyClass] {
return [StoredRoutes.self, NSArray.self, NSString.self]
}
override func transformedValue(_ value: Any?) -> Any? {
guard let data = value as? Data else {
fatalError("Wrong data type: value must be of type Data. The type the value recieved was \(type(of: value)).")
}
return super.transformedValue(data)
}
override func reverseTransformedValue(_ value: Any?) -> Any? {
guard let storedRoutes = value as? StoredRoutes else {
fatalError("Wrong data type: value must be of type StoredRoutes. The type of the value recieved was \(type(of: value))")
}
return super.reverseTransformedValue(storedRoutes)
}
public static func register() {
let transformer = StoredRoutesValueTransformer()
ValueTransformer.setValueTransformer(transformer, forName: name)
}
}