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"