Following this Medium article I created the following class:
import CoreMotion
public class Attitude : NSObject, NSSecureCoding
{
public static var supportsSecureCoding = true
var quaternion: CMQuaternion
enum Key : String
{
case quaternionX
case quaternionY
case quaternionZ
case quaternionW
}
public init(quaternion: CMQuaternion)
{
self.quaternion = quaternion
}
public required init?(coder: NSCoder)
{
let x = coder.decodeDouble(forKey: Key.quaternionX.rawValue)
let y = coder.decodeDouble(forKey: Key.quaternionY.rawValue)
let z = coder.decodeDouble(forKey: Key.quaternionZ.rawValue)
let w = coder.decodeDouble(forKey: Key.quaternionW.rawValue)
quaternion = CMQuaternion(x: x, y: y, z: z, w: w)
}
public func encode(with coder: NSCoder)
{
coder.encode(quaternion.x, forKey: Key.quaternionX.rawValue)
coder.encode(quaternion.y, forKey: Key.quaternionY.rawValue)
coder.encode(quaternion.z, forKey: Key.quaternionZ.rawValue)
coder.encode(quaternion.w, forKey: Key.quaternionW.rawValue)
}
}
public class AttitudeTransformer : NSSecureUnarchiveFromDataTransformer
{
public override static var allowedTopLevelClasses: [AnyClass]
{
[Attitude.self]
}
static func register()
{
let className = String(describing: AttitudeTransformer.self)
let name = NSValueTransformerName(className)
let transformer = AttitudeTransformer()
ValueTransformer.setValueTransformer(transformer, forName: name)
}
}
I've double checked and set things up correctly on CoreData side it seems:
Found this old post, but NSSecureUnarchiveFromDataTransformer extends the new ValueTransformer, so I don't see what I'm missing. Also tried adding @objc(AttitudeTransformer).
Any ideas?
