我想在领域中使用带有可选类型的自定义类。
为了序列化和使用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?
的逻辑,反之则为一组自定义属性。
答案 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)
}
}
}