序列化具有自定义类

时间:2015-11-09 17:52:58

标签: swift realm

我想在领域中使用带有可选类型的自定义类。 为了序列化和使用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!)
            }
        }
    }
...
}

有更好的方法吗? 我们是否应该在Realm中使用某种协议来允许我们为特定属性返回可选的NSData? 另一个想法是拥有一个自定义方法,例如ignoredProperties,它可以用来实现将对象转换为NSData?的逻辑,反之则为一组自定义属性。

2 个答案:

答案 0 :(得分:1)

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

就个人而言,我是你建议的后一种方法的粉丝:添加一个新属性,将其标记为忽略,然后手动实现其访问器以在相关的Realm支持的属性上执行必要的逻辑。

答案 1 :(得分:0)

此时没有其他方法或解决方法来管理我的问题。 但是,我发现了另一种更清晰的方法来处理这种需求。 事实上,主要概念是相同的,但它使用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)
        }
    }
}