CustomPersistable
public protocol CustomPersistable : _CustomPersistable
一种可以与 Realm 支持的类型相互映射的类型。
要在 Realm 原生不支持的 Realm 中存储类型,请将该类型声明为符合 CustomPersistable 或 FailableCustomPersistable。这需要定义一个名为PersistedType
的关联类型(指示此类型将映射到什么 Realm 类型)、一个采用PersistedType
的初始化程序以及一个返回相应PersistedType
的属性。 例如,要使URL
持久化:
// Not all strings are valid URLs, so this uses
// FailableCustomPersistable to handle the case when the data
// in the Realm isn't a valid URL.
extension URL: FailableCustomPersistable {
typealias PersistedType = String
init?(persistedValue: String) {
self.init(string: persistedValue)
}
var persistableValue: PersistedType {
self.absoluteString
}
}
完成此操作后,您可以使用 URL 定义属性:
class MyModel: Object {
@Persisted var url: URL
@Persisted var mapOfUrls: Map<String, URL>
}
PersistedType
可以是 Realm 或EmbeddedObject
子类支持的任何基元类型。 如果需要为映射类型存储多条数据,可以使用EmbeddedObject
子类。 例如,要存储CGPoint
:
// Define the storage object. A type used for custom mappings
// does not have to be used exclusively for custom mappings,
// and more than one type can map to a single embedded object
// type.
class CGPointObject: EmbeddedObject {
@Persisted var double: x
@Persisted var double: y
}
// Define the mapping. This mapping isn't failable, as the
// data stored in the Realm can always be interpreted as a
// CGPoint.
extension CGPoint: CustomPersistable {
typealias PersistedType = CGPointObject
init(persistedValue: CGPointObject) {
self.init(x: persistedValue.x, y: persistedValue.y)
}
var persistableValue: PersistedType {
CGPointObject(value: [x, y])
}
}
class PointModel: Object {
// Note that types which are mapped to embedded objects do
// not have to be optional (but can be).
@Persisted var point: CGPoint
@Persisted var line: List<CGPoint>
}
查询是对持久化类型执行的,而不是对自定义持久化类型执行的。 传递到查询中的值可以是持久类型,也可以是自定义持久类型。 对于映射到嵌入式对象的自定义持久类型,将使用成员相等性。 例如, realm.objects(PointModel.self).where { $0.point == CGPoint(x: 1, y: 2) }
相当于"point.x == 1 AND point.y == 2"
。
-
从持久化类型构造该类型的实例。
声明
Swift
init(persistedValue: PersistedType)
-
从该类型构造持久化类型的实例。
声明
Swift
var persistableValue: PersistedType { get }