在Realm Swift中如何存储时分秒格式的时间间隔
嘿,针对你这个健身计时器的时间间隔存储问题,我有几个实用的方案,其中首推的绝对是存储总秒数,这应该是最贴合你需求的最优解:
首推方案:存储总秒数
这个方案完美避开了你提到的所有痛点:不需要额外的Time表,Realm原生支持Int类型,读写效率极高,而且转换时分秒的逻辑也很清晰。
具体实现可以这样:在你的计时器模型里只存一个totalSeconds字段,然后用计算属性来对外暴露时分秒的读写接口——计算属性不会被Realm持久化,只是做逻辑转换:
class WorkoutTimer: Object { // 唯一持久化到Realm的字段 @objc dynamic var totalSeconds: Int = 0 // 对外的时分秒读写接口 var hour: Int { get { totalSeconds / 3600 } set { // 可以在这里加合法性校验,比如小时不能为负 let validHour = max(0, newValue) totalSeconds = validHour * 3600 + minute * 60 + second } } var minute: Int { get { (totalSeconds % 3600) / 60 } set { let validMinute = max(0, min(newValue, 59)) totalSeconds = hour * 3600 + validMinute * 60 + second } } var second: Int { get { totalSeconds % 60 } set { let validSecond = max(0, min(newValue, 59)) totalSeconds = hour * 3600 + minute * 60 + validSecond } } }
这个方案的优势:
- 完全符合Realm的存储特性,不会生成额外表或冗余字段
- 时分秒的读写逻辑封装在计算属性里,外部调用和原来的
Time对象几乎无差别 - 可以轻松添加合法性校验,避免出现秒数超过59、负数时间等不合理情况
- 做时间计算(比如加时、减时)非常方便,直接操作
totalSeconds即可
备选方案(不推荐,但可以参考)
如果你出于某些特殊原因不想用总秒数,还有两个备选,但都不如总秒数高效:
- 存储格式化字符串:比如存
"00:25:30"这样的字符串,用时再解析成时分秒。但缺点很明显:字符串解析容易出错,无法直接做时间运算,而且Realm查询时也不方便筛选时间长度。 - 自定义编码为Data:把时分秒打包成
Data存储,需要自己实现编码解码逻辑。Realm支持Data类型,但这种方式读写都要额外处理,完全是画蛇添足,没必要。
总的来说,存储总秒数是最简洁、高效且符合你需求的方案,完全可以替代原来的Time对象或元组方案。
内容的提问来源于stack exchange,提问作者WBuck
相关产品推荐
相关产品推荐

