如何在RealmSwift中用@Persisted存储ClosedRange<Int>类型?
解决Realm @Persisted存储ClosedRange的问题
Realm原生不支持ClosedRange<Int>类型的持久化,你可以通过自定义转换器实现该类型与Realm支持的可持久化类型之间的映射,无需拆分上下限为单独字段。
步骤1:实现自定义转换器
创建符合Transformable协议的转换器,负责ClosedRange<Int>与Realm可存储类型的双向转换:
import RealmSwift // 定义Realm可直接存储的范围结构体 struct StoredIntRange: Persistable { let lower: Int let upper: Int } // 实现ClosedRange<Int>与StoredIntRange的转换逻辑 struct ClosedRangeIntTransform: Transformable { // 业务代码中使用的原始类型 typealias Input = ClosedRange<Int> // Realm实际存储的类型 typealias Output = StoredIntRange // 将ClosedRange转成Realm可存储的结构体 func transformToRealm(_ value: Input) -> Output { StoredIntRange(lower: value.lowerBound, upper: value.upperBound) } // 从Realm存储的结构体转回ClosedRange func transformFromRealm(_ value: Output) -> Input { value.lower...value.upper } }
步骤2:在模型中使用转换器
在@Persisted属性中通过transform参数指定自定义转换器:
class UserObject: Object { @Persisted(transform: ClosedRangeIntTransform.self) var ageRange: ClosedRange<Int> }
完成后,你可以直接在代码中操作ClosedRange<Int>类型的ageRange属性,Realm会自动通过转换器完成存储和读取的双向转换。
内容的提问来源于stack exchange,提问作者Gargo
相关产品推荐
相关产品推荐

