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我们可以避免一些其他样板代码。我在下面添加了它。