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".