SwiftUI如何避免日期倒计时出现负值?
倒计时负值问题解决方案
你可以直接修改numDaysWithToday计算属性的取值逻辑,对返回的差值做下限截断,强制最小值为0即可,修改后的代码如下:
var numDaysWithToday: Int { /// dayFromNow 示例为14天后的日期 get { let remainingDays = Calendar.current.dateComponents([.day], from: Date(), to: dateFromNow).day ?? 0 // 取计算结果和0的较大值,所有小于0的结果都会返回0 return max(0, remainingDays) } } Text("\(numDaysWithToday) days left")
逻辑说明
- 当当前日期晚于你设定的目标日期
dateFromNow时,dateComponents接口返回的day值会是负数 - 用
max函数做取值截断后,只要剩余天数小于等于0,都会统一返回0,不会再出现负值倒计时的情况 - 这里同时把原代码的强制解包
!替换成了可选默认值?? 0,避免日期计算异常返回nil时触发崩溃
可选优化
如果需要更友好的到期提示,也可以在UI渲染层加判断:
if numDaysWithToday > 0 { Text("\(numDaysWithToday) 天剩余") } else { Text("已到期") }
内容的提问来源于stack exchange,提问作者Maksym Kucherenko
相关产品推荐
相关产品推荐

