Swift 序列化具有自定义类的可选属性的最佳方法

Swift 序列化具有自定义类的可选属性的最佳方法,swift,realm,Swift,Realm,我希望在领域中使用带有可选类型的自定义类。 为了序列化并使用CLLocation实例,我的想法如下: class MyClass : Object { dynamic var _coordinates :NSData? var coordinates :CLLocation? { get { if _coordinates == nil { return nil } // w

我希望在领域中使用带有可选类型的自定义类。 为了序列化并使用
CLLocation
实例,我的想法如下:

class MyClass : Object  {
    dynamic var _coordinates    :NSData?

    var coordinates :CLLocation? {
        get {
            if _coordinates == nil {
                return nil
            }
// we can cache it too to avoid deserialization every time
            let coordinatesObj : CLLocation = NSKeyedUnarchiver.unarchiveObjectWithData(_coordinates!) as! CLLocation
            return coordinatesObj
        }
        set(newCoordinates) {
            if newCoordinates == nil {
                _coordinates = nil
            } else {
                _coordinates = NSKeyedArchiver.archivedDataWithRootObject(newCoordinates!)
            }
        }
    }
...
}
有更好的办法吗? 我们是否应该在领域中有某种协议,允许我们为特定属性返回可选的
NSData

另一个想法是有一个像ignoredProperties这样的自定义方法,它可以用来实现将对象转换为
NSData?
的逻辑,反之则是一组自定义属性。

我真的认为没有比这更好的方法了。如果您希望提供比Realm支持的对象更复杂的对象,则始终需要实现一些附加逻辑来序列化/反序列化该数据


就个人而言,我非常喜欢您建议的后一种方法:添加一个新属性,将其标记为忽略,然后手动实现其访问器,以对相关领域支持的属性执行必要的逻辑。

目前没有其他方法或解决方法来管理我的问题。 然而,我找到了另一种更清晰的方法来处理这些需求。 事实上,主要概念是相同的,但它使用
flatMap
,以避免一些样板检查。 希望能有帮助

class MyClass: Object  {
    dynamic var _coordinates: NSData?

    var coordinates: CLLocation? {
        get {
            return _coordinates.flatMap(NSKeyedUnarchiver.unarchiveObjectWithData) as? CLLocation
        }
        set {
            _coordinates = newValue.flatMap(NSKeyedArchiver.archivedDataWithRootObject)
        }
    }
}

是的,我已经在github领域官方页面上讨论过了,但这是处理这个问题的更干净的方法。然而,使用flatMap我们可以避免一些其他样板代码。我在下面添加了它。