CustomPersistable

public protocol CustomPersistable : _CustomPersistable

Realm がサポートするタイプにマッピングしたり、タイプからマップしたりできるタイプ。

Realm がネイティブにサポートしていない Realm に型を保存するには、型を CustomPersistable または FailablecustomPersistable のいずれかに準拠しているものとして宣言します。これには、このタイプがマッピングされる Realm タイプ、 PersistedTypeを取得する初期化子、適切な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"と同等です。