Swift中一行代码判断可选Date是否在未来的写法是否安全?
问题分析与解答
你的这行代码语法上完全合法,Swift可以正常编译运行,但确实属于不良编码风格,还存在逻辑隐患。
核心问题:两次.now的求值时间差
Swift里的Date.now(也就是你写的.now)每次被访问时,都会生成一个代表当前时刻的新Date实例。这意味着你代码里的两个.now可能在极短的时间间隔内被先后求值——哪怕只差1纳秒,左边的.now都会比右边的早。
举个极端情况:如果optionalDate是nil,理论上我们期望(nil ?? .now) >= .now的结果是true(因为当前时间等于当前时间,>=包含相等的情况),但如果两次.now求值有时间差,左边的.now会略早于右边,此时结果就会变成false,完全不符合预期逻辑。
正确的写法
解决问题的关键是只获取一次当前时间,存为常量后复用:
let currentTime = Date.now let dateIsInFuture = (optionalDate ?? currentTime) >= currentTime
这种写法既消除了时间差带来的逻辑漏洞,代码可读性也更强,其他开发者能一眼看懂你的判断逻辑。
内容的提问来源于stack exchange,提问作者CalebK
相关产品推荐
相关产品推荐

