You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 13:37:33