CustomPersistable
public protocol CustomPersistable : _CustomPersistable
Um tipo que pode ser mapeado de e para um tipo suportado pelo Realm.
Para armazenar tipos em um Realm para o qual o Realm não oferece suporte nativo, declare o tipo como em conformidade com CustomPersistable ou FailableCustomPersistable. Isso requer a definição de um associatedtype chamado PersistedType
, que indica para qual tipo de Realm esse tipo será mapeado, um inicializador que receba o PersistedType
e uma propriedade que retorne o PersistedType
apropriado. Por exemplo, para tornar o URL
persistente:
// 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
}
}
Depois de fazer isso, você pode definir propriedades usando a URL:
class MyModel: Object {
@Persisted var url: URL
@Persisted var mapOfUrls: Map<String, URL>
}
PersistedType
pode ser qualquer um dos tipos primitivos suportados pelo Realm ou uma subclasse EmbeddedObject
. Subclasses EmbeddedObject
podem ser usadas se você precisar armazenar mais de uma parte dos dados para seu tipo mapeado. Por exemplo, para armazenar 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>
}
A query é realizada no tipo persistente e não no tipo persistente personalizado. Os valores passados para query podem ser do tipo persistente ou do tipo persistente personalizado. Para tipos persistentes personalizados que são mapeados para objetos incorporados, a igualdade de todos os nós será usada. Por exemplo, realm.objects(PointModel.self).where { $0.point == CGPoint(x: 1, y: 2) }
é equivalente a "point.x == 1 AND point.y == 2"
.
-
Construa uma instância deste tipo a partir do tipo persistente.
Declaração
Swift
init(persistedValue: PersistedType)
-
Construa uma instância do tipo persistente a partir deste tipo.
Declaração
Swift
var persistableValue: PersistedType { get }