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" 와 동일합니다.